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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

剑指offer之3-10题解

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

劍指offer之3-10題解


前言:

最近開始刷牛客的劍指offer,把刷過的題,代碼總結一下。有參考網上的代碼,一起加油。

目錄

  • 從尾到頭打印鏈表
  • 重建二叉樹
  • 用兩個棧實現隊列
  • 旋轉數組的最小數字
  • 斐波那契數列
  • 跳臺階
  • 變態跳臺階
  • 矩陣覆蓋

  • 3. 從尾到頭打印鏈表

    (一)題目描述

    (二) 思路

  • 使用棧:棧具有先進先出的特點,在遍歷鏈表時將值按順序放入棧中,最后出棧的順序即為逆序。
  • (三)代碼實現

    /** * public class ListNode { * int val; * ListNode next = null; * * ListNode(int val) { * this.val = val; * } * } * */ import java.util.ArrayList; import java.util.Stack; public class Solution {public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {Stack<Integer> stack = new Stack<>();while (listNode!=null){stack.add(listNode.val);listNode = listNode.next;}ArrayList<Integer> list = new ArrayList<>();while (!stack.isEmpty()){list.add(stack.pop());}return list;} }

    4. 重建二叉樹

    (一)題目描述

    (二) 思路

  • 前序遍歷的第一個值為根節點的值,使用這個值將中序遍歷結果分成兩部分,左部分為樹的左子樹中序遍歷結構,右部分為右子樹中序遍歷結果。
  • (三)代碼實現(報錯,先跳過)

    /*** Definition for binary tree* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val = x; }* }*/ import java.util.HashMap; import java.util.Map; public class Solution {public class Solution {private Map<Integer,Integer> indexForInOrders = new HashMap<>();public TreeNode reConstructBinaryTree(int[] pre, int[] in) {for (int i = 0; i < in.length; i++) {indexForInOrders.put(in[i],i);}return reConstructBinaryTree(pre,0,pre.length-1,0);}public TreeNode reConstructBinaryTree(int[] pre, int preL,int preR,int inL) {if (preL>preR)return null;TreeNode root = new TreeNode(pre[preL]);int inIndex = indexForInOrders.get(root.val);int leftTreeSize = inIndex-inL;root.left = reConstructBinaryTree(pre,preL+1,preL+leftTreeSize,inL);root.right = reConstructBinaryTree(pre,preL+leftTreeSize+1,preR,inL+leftTreeSize+1);return root;} }

    5. 用兩個棧實現隊列

    (一)題目描述

    (二) 思路

  • push操作:直接push。
  • pop操作:將stack1的數據全部push進stack2,返回stack2棧頂元素即可。
  • (三)代碼實現

    import java.util.Stack;public class Solution {Stack<Integer> stack1 = new Stack<>();Stack<Integer> stack2 = new Stack<>();public void push(int node) {stack1.push(node);}public int pop() {if (stack1.isEmpty() && stack2.isEmpty()) {throw new RuntimeException("隊列為null");} else if (stack2.isEmpty()) {while (!stack1.isEmpty()) {stack2.push(stack1.pop());}}return stack2.pop();} }

    6. 旋轉數組的最小數字

    (一)題目描述

    (二) 思路

  • 我的思路是直接找到最小值返回即可。代碼通過。
  • 大佬的思路是通過二分查找算法進行求解(l代表low,m代表mid,h代碼high):
  • 當nums[m]<=nums[h]時,表示[m,h]區間內的數組是非遞減數組,[l,m]區間內是旋轉數組,此時令h = m;
  • 否則[m+1,h]區間內是旋轉數組,令 l =m + 1
  • (三)代碼實現
    大佬代碼:

    public class Solution {public int minNumberInRotateArray(int[] nums){if (nums.length==0){return 0;}int l = 0;int h = nums.length-1;while (l<h){int m = l+(h-l)/2;if (nums[m]<=nums[h]){h = m;}else {l = m+1;}}return nums[l];} }

    小白代碼:

    public class Solution {public int minNumberInRotateArray(int [] array) {if (array.length==0){return 0;}int minIndex = 0;for (int i = 1; i < array.length; i++) {if (array[minIndex]>array[i]){minIndex = i;}}return array[minIndex];} }

    7. 斐波那契數列

    (一)題目描述

    斐波那契數列公式:

    (二)思路

  • 使用遞歸求解,但是會重復計算一些子問題。例如,計算f(4)需要計算f(3)和f(2),計算f(3)需要計算f(2)和f(1),可以看到f(2)被重復計算了。
  • 動態規劃:考慮到第i項只與第i-1和第i-2項有關,因此只需要存儲前兩項就能求解第i項,從而將空間復雜度由O(N)降為O(1);
  • (三)代碼實現

  • 遞歸版一
  • public class Solution {public static int Fibonacci(int n) {if (n <= 1) {return n;}return Fibonacci(n - 1) + Fibonacci(n - 2);} }
  • 遞歸版二
  • public class Solution {public int Fibonacci(int n) {if (n <= 1) {return n;}int[] fib = new int[n + 1];fib[1] = 1;for (int i = 2; i <= n; i++) {fib[i] = fib[i - 1] + fib[i - 2];}return fib[n];} }
  • 動態規劃版
  • public class Solution {public static int Fibonacci(int n) {if (n <= 1) {return n;}int pre2 = 0;int pre1 = 1;int fib = 0;for (int i = 2; i <= n; i++) {fib = pre2 + pre1;pre2 = pre1;pre1 = fib;}return fib;} }

    8. 跳臺階

    (一)題目描述

    (二)思路

  • 當n=1時,有一種跳法
  • 當n=2時,有兩種跳法
  • 跳n階臺階,可以先跳1階臺階,再跳n-1階臺階;或者先跳2階臺階,再跳n-2階臺階。而n-1和n-2階臺階的跳法可以看成子問題,該問題的遞推公式為:
  • (三)代碼實現

  • 遞歸版
  • public class Solution {public int JumpFloor(int target) {if (target <= 2) {return target;} else {return JumpFloor(target - 1) + JumpFloor(target - 2);}}}
  • 動態規劃版
  • public class Solution {public int JumpFloor(int target) {if (target <= 2) {return target;}int pre1 = 2;int pre2 = 1;int result = 0;for (int i = 3; i <= target; i++) {result = pre1 + pre2;pre2 = pre1;pre1 = result;}return result;}}

    9. 變態跳臺階

    (一)題目描述

    (二)思路

  • 跳上n-1級臺階,可以從n-2級跳1級上去,也可以從n-3級跳2級上去…那么
  • f(n-1) = f(n-2) + f(n-3) + … + f(0)

  • 同樣,跳上n級臺階,可以用n-1級跳1級上去,也可以從n-2級跳2級上去…那么
  • f(n) = f(n-1) + f(n-2) + … + f(0)

  • 綜上可得
  • f(n) = 2 * f(n-1)

    (三)代碼實現

    public class Solution {public int JumpFloorII(int target) {if (target <= 2) {return target;}return 2 * JumpFloorII(target - 1);}}

    10. 矩陣覆蓋

    (一)題目描述


    (二)思路

  • 當n為1時,只有一種覆蓋方法:
  • 當n為2時,有兩種覆蓋方法:
  • 要覆蓋2n的大矩陣,可以先覆蓋21的矩形,再覆蓋2*(n-1)的矩形;或者先覆蓋22的矩形,再覆蓋2(n-2)的矩形。而覆蓋2*(n-1)和2*(n-2)的矩形可以看成子問題。該問題的遞歸公式如下:
  • (三)代碼實現

  • 遞歸版
  • public class Solution {public int RectCover(int target) {if (target <= 2) {return target;}return RectCover(target - 1) + RectCover(target - 2);} }
  • 動態規劃版
  • public class Solution {public int RectCover(int target) {if (target <= 2) {return target;}int pre2 = 1;int pre1 = 2;int result = 0;for (int i = 3; i <= target; i++) {result = pre1 + pre2;pre2 = pre1;pre1 = result;}return result;} }

    總結

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

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