跟我打卡LeetCode 61旋转链表62不同路径63不同路径 II
原創公眾號:bigsai
關注后回復進群即可加入力扣打卡群,歡迎劃水。近期打卡:
LeetCode 49字母異位詞分組&50pow(x,n)&51八皇后
LeetCode打卡 52八皇后Ⅱ&53最大子序和&54螺旋矩陣
LeetCode 55跳躍游戲&56合并區間&57插入區間
跟我打卡LeetCode 58最后一個單詞長度&59螺旋矩陣Ⅱ&60排列序列
旋轉鏈表
給定一個鏈表,旋轉鏈表,將鏈表每個節點向右移動 k 個位置,其中 k 是非負數。
示例 1:
輸入: 1->2->3->4->5->NULL, k = 2
輸出: 4->5->1->2->3->NULL
解釋:
向右旋轉 1 步: 5->1->2->3->4->NULL
向右旋轉 2 步: 4->5->1->2->3->NULL
示例 2:
輸入: 0->1->2->NULL, k = 4
輸出: 2->0->1->NULL
解釋:
向右旋轉 1 步: 2->0->1->NULL
向右旋轉 2 步: 1->2->0->NULL
向右旋轉 3 步: 0->1->2->NULL
向右旋轉 4 步: 2->0->1->NULL
分析
本題的話就是題意比較清晰,就是旋轉鏈表將鏈表進行右移動k個。
但是具體的處理上可能存在時間復雜度的差距,比如你可以第一次遍歷到結尾,然后構成一個循環鏈表不停遍歷找到合適的位置?;蛘呦缺闅v一次到尾,然后再找到需要移動的位置去進行操作,但是這樣都避免不了循環兩次。
那本題采用什么方法呢?使用快慢指針,快指針先走k步,然后快慢指針一起走,一直到快指針走到尾。 執行以下操作即可:
- fast.next=head
- ListNode team=slow
- slow.next=null
- return team
但是過程可能沒那么順暢,很可能k比整個鏈表的長度還大,所以可能k沒跑完就遍歷結束了,這種情況也不用擔心,當fast到底的時候可以通過一次計算算出真實有效的移動位數。比如如果鏈表長10讓你右移59,69,79這些和移動9次是一樣的,所以只需要slow再次移動到真實有效的地方即可。
實現的代碼為:
public ListNode rotateRight(ListNode head, int k) {if(k==0||head==null)return head;ListNode fast=head;ListNode slow=head;for(int i=0;i<k;i++){ if(fast.next==null)//說明超出范圍了 但是此時知道最大長度了{ k=(k)%(i+1); if(k==0)return head; for(int j=0;j<i-k;j++){slow=slow.next;}break;}fast=fast.next;}while (fast.next !=null) {fast=fast.next;slow=slow.next;} fast.next=head;ListNode team=slow.next;slow.next=null;return team;}62不同路徑
一個機器人位于一個 m x n 網格的左上角 (起始點在下圖中標記為“Start” )。
機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記為“Finish”)。
問總共有多少條不同的路徑?
例如,上圖是一個7 x 3 的網格。有多少可能的路徑?
示例 1:
輸入: m = 3, n = 2
輸出: 3
解釋:
從左上角開始,總共有 3 條路徑可以到達右下角。
1 . 向右 -> 向右 -> 向下
2 . 向右 -> 向下 -> 向右
3 . 向下 -> 向右 -> 向右
示例 2:
輸入: m = 7, n = 3
輸出: 28
提示:
1 <= m, n <= 100
題目數據保證答案小于等于 2 * 10 ^ 9
分析:
可用搜素,但是更是入門級別的動態規劃。其狀態方程為: 在dp[i][j]=dp[i-1][j]+dp[i][j-1];當然有特殊情況是需要考慮的,就是最上一行和最左一列以及起始位置。因為會出現越界的情況。
- 你可以特殊判斷,先處理邊界然后再進行計算。
- 但是你也可以像我一樣,設置的二維數組擴大一點,把邊界也當成一個普通情況處理,只不過將dp[0][1]或者dp[1][0]其中設為一個能夠正確計算dp[1][1]=1即可(妙啊)。
實現代碼為:
public int uniquePaths(int m, int n) {int dp[][]=new int[m+1][n+1];dp[0][1]=1;for(int i=1;i<m+1;i++){for(int j=1;j<n+1;j++){dp[i][j]=dp[i-1][j]+dp[i][j-1];}}return dp[m][n]; }不同路徑Ⅱ
一個機器人位于一個 m x n 網格的左上角 (起始點在下圖中標記為“Start” )。
機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記為“Finish”)。
現在考慮網格中有障礙物。那么從左上角到右下角將會有多少條不同的路徑?
網格中的障礙物和空位置分別用 1 和 0 來表示。
示例 1: 輸入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]] 輸出:2 解釋: 3x3 網格的正中間有一個障礙物。 從左上角到右下角一共有 2 條不同的路徑: 1. 向右 -> 向右 -> 向下 -> 向下 2. 向下 -> 向下 -> 向右 -> 向右示例 2: 輸入:obstacleGrid = [[0,1],[0,0]] 輸出:1提示: m == obstacleGrid.length n == obstacleGrid[i].length 1 <= m, n <= 100 obstacleGrid[i][j] 為 0 或 1這題你可以使用搜索,其實跟搜索關系越來越大了,但依然可以使用dp,就是在遍歷的時候遇到障礙物的位置跳過計算即可 。該位置始終為0即可。
實現代碼為:
public int uniquePathsWithObstacles(int[][] obstacleGrid) {int m=obstacleGrid.length;int n=obstacleGrid[0].length;int dp[][]=new int[m+1][n+1];dp[0][1]=1;for(int i=1;i<m+1;i++){for(int j=1;j<n+1;j++){if(obstacleGrid[i-1][j-1]!=1)dp[i][j]=dp[i-1][j]+dp[i][j-1];}}//System.out.println(Arrays.deepToString(dp));return dp[m][n];}最后
本次打卡結束了,明日繼續更新,懇請csdn的朋友們幫個忙🙏,微信搜索「bigsai」關注我的原創公眾號,新人初期希望大家能夠支持一下,白嫖電子書,回復「進群」加入力扣打卡群,歡迎來撩謝謝!
總結
以上是生活随笔為你收集整理的跟我打卡LeetCode 61旋转链表62不同路径63不同路径 II的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 「八大排序算法」16张图带你搞懂基数排序
- 下一篇: 「万字图文」史上最姨母级Java继承详解