日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

剑指offer之16-20题解

發布時間:2024/2/28 编程问答 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 剑指offer之16-20题解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

劍指offer之16-20題解


目錄

  • 合并兩個排序的鏈表
  • 樹的子結構
  • 二叉樹的鏡像
  • 順時針打印矩陣
  • 包含min函數的棧

  • 16. 合并兩個排序的鏈表

    (一)題目描述

    輸入兩個單調遞增的鏈表,輸出兩個鏈表合成后的鏈表,當然我們需要合成后的鏈表滿足單調不減規則。

    (二)思路

  • 遞歸:如果list1.val<=list2.val,則list1位置不變,它的下一位從list1.next和list2中選出。遞歸。否則list2的位置不變,它的下一位從list1和list2.next中選出。遞歸。

  • 迭代:跟歸并排序一樣,當兩個鏈表不為null時,誰小誰依次加入head節點。最后會有list1或者list2剩余節點沒有加入,遍歷加入即可。

  • (三)代碼實現

  • 遞歸代碼實現
  • public class Solution {public ListNode Merge(ListNode list1,ListNode list2) {if (list1==null){return list2;}if (list2==null){return list1;}if (list1.val<=list2.val){list1.next = Merge(list1.next,list2);return list1;}else {list2.next = Merge(list1,list2.next);return list2;}} }
  • 迭代代碼實現
  • public class Solution {public ListNode Merge(ListNode list1, ListNode list2) {ListNode head = new ListNode(-1);ListNode cur = head;while (list1 != null && list2 != null) {if (list1.val <= list2.val) {cur.next = list1;list1 = list1.next;} else {cur.next = list2;list2 = list2.next;}cur = cur.next;}if (list1 != null) {cur.next = list1;}if (list2 != null) {cur.next = list2;}return head.next;} }

    17. 樹的子結構

    (一)題目描述

    輸入兩棵二叉樹A,B,判斷B是不是A的子結構。(ps:我們約定空樹不是任意一個樹的子結構)

    (二)思路

  • isSubtreeWithRoot()方法:
  • 判斷節點A和B是否相同,如果不同返回false。
  • 如果相同繼續遞歸A的左孩子和B的左孩子,A的右孩子和B的右孩子看是否相同。
  • 當root2==null時,說明比較完畢,返回true;
  • 當root1==null時,說明遍歷完A都沒有找到一樣的,返回false;
  • (三)代碼實現

    public class Solution {public boolean HasSubtree(TreeNode root1, TreeNode root2) {if (root1 == null || root2 == null)return false;return isSubtreeRoot(root1, root2) || HasSubtree(root1.left, root2) || HasSubtree(root1.right, root2);}private boolean isSubtreeRoot(TreeNode root1, TreeNode root2) {if (root2 == null)return true;if (root1 == null)return false;if (root1.val != root2.val)return false;return isSubtreeRoot(root1.left, root2.left) && isSubtreeRoot(root1.right, root2.right);} }

    18. 二叉樹的鏡像

    (一)題目描述

    (二)思路

  • 交換左右節點,然后依次遞歸下去。
  • (三)代碼實現

    public class Solution {public void Mirror(TreeNode root) {if (root == null)return;swap(root);Mirror(root.left);Mirror(root.right);}private void swap(TreeNode root) {TreeNode t = root.left;root.left = root.right;root.right = t;} }

    19. 順時針打印矩陣

    (一)題目描述
    輸入一個矩陣,按照從外向里以順時針的順序依次打印出每一個數字,例如,如果輸入如下4 X 4矩陣: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 則依次打印出數1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.

    (二)思路

  • 找到左上角和右下角,打印一圈,然后左上角++,右下角–,再次打印一圈,依次類推
  • (三)代碼實現

  • 大佬代碼
  • import java.util.ArrayList; public class Solution {public ArrayList<Integer> printMatrix(int[][] matrix) {ArrayList<Integer> ret = new ArrayList<>();int r1 = 0, r2 = matrix.length - 1, c1 = 0, c2 = matrix[0].length - 1;while (r1 <= r2 && c1 <= c2) {for (int i = c1; i <= c2; i++) {ret.add(matrix[r1][i]);}for (int i = r1 + 1; i <= r2; i++) {ret.add(matrix[i][c2]);}if (r1 != r2) {for (int i = c2 - 1; i >= c1; i--) {ret.add(matrix[r2][i]);}}if (c1 != c2) {for (int i = r2 - 1; i > r1; i--) {ret.add(matrix[i][c1]);}}r1++;r2--;c1++;c2--;}return ret;} }
  • 比較好理解的代碼,不過長了一點
  • import java.util.ArrayList; public class Solution {public ArrayList<Integer> printMatrix(int[][] matrix) {int ar = 0, ac = 0, br = matrix.length - 1, bc = matrix[0].length - 1;ArrayList<Integer> list = new ArrayList<>();while (ar <= br && ac <= bc) {ArrayList<Integer> list1 = printRound(matrix, ar++, ac++, br--, bc--);for (int i = 0; i < list1.size(); i++) {list.add(list1.get(i));}}return list;}private ArrayList<Integer> printRound(int[][] matrix, int ar, int ac, int br, int bc) {ArrayList<Integer> list = new ArrayList<Integer>();if (ar == br) {for (int i = ac; i <= bc; i++) {list.add(matrix[ar][i]);}} else if (ac == bc) {for (int i = ar; i <= br; i++) {list.add(matrix[i][ac]);}} else {int curr = ar;int curc = ac;while (curc != bc) {list.add(matrix[ar][curc]);curc++;}while (curr != br) {list.add(matrix[curr][bc]);curr++;}while (curc != ac) {list.add(matrix[br][curc]);curc--;}while (ar != curr) {list.add(matrix[curr][ac]);curr--;}}return list;} }

    20. 包含min函數的棧

    (一)題目描述

    定義棧的數據結構,請在該類型中實現一個能夠得到棧中所含最小元素的min函數(時間復雜度應為O(1))。

    (二)思路

    生成兩個棧,一個存放進入的數據元素dataStack,一個存放最小值minStack。

  • push操作:dataStack直接入棧,minStack如果為null,直接入棧,不為nullpeek出棧頂元素和入棧的元素比較,誰小誰入棧。
  • pop操作:兩個棧直接pop。
  • top操作:返回dataStack.peek().
  • min操作:peek出minStack棧頂元素
  • (三)代碼實現

    import java.util.Stack;public class Solution {private Stack<Integer> dataStack = new Stack<>();private Stack<Integer> minStack = new Stack<>();public void push(int node) {dataStack.push(node);minStack.push(minStack.isEmpty() ? node : Math.min(minStack.peek(), node));}public void pop() {dataStack.pop();minStack.pop();}public int top() {return dataStack.peek();}public int min() {return minStack.peek();} }

    總結

    以上是生活随笔為你收集整理的剑指offer之16-20题解的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。