摘要:動態規劃復雜度時間空間思路因為要走最短路徑,每一步只能向右方或者下方走。所以經過每一個格子路徑數只可能源自左方或上方,這就得到了動態規劃的遞推式,我們用一個二維數組儲存每個格子的路徑數,則。
Unique Paths I
動態規劃 復雜度A robot is located at the top-left corner of a m x n grid (marked "Start" in the diagram below).
The robot can only move either down or right at any point in time. The robot is trying to reach the bottom-right corner of the grid (marked "Finish" in the diagram below).
How many possible unique paths are there?
時間 O(NM) 空間 O(NM)
思路因為要走最短路徑,每一步只能向右方或者下方走。所以經過每一個格子路徑數只可能源自左方或上方,這就得到了動態規劃的遞推式,我們用一個二維數組dp儲存每個格子的路徑數,則dp[i][j]=dp[i-1][j]+dp[i][j-1]。最左邊和最上邊的路徑數都固定為1,代表一直沿著最邊緣走的路徑。
代碼public class Solution { public int uniquePaths(int m, int n) { int[][] dp = new int[m][n]; for(int i = 0; i < m; i++){ dp[i][0] = 1; } for(int i = 0; i < n; i++){ dp[0][i] = 1; } for(int i = 1; i < m; i++){ for(int j = 1; j < n; j++){ dp[i][j] = dp[i-1][j] + dp[i][j-1]; } } return dp[m-1][n-1]; } }一維數組 復雜度
時間 O(NM) 空間 O(N)
思路實際上我們可以復用每一行的數組來節省空間,每個元素更新前的值都是其在二維數組中對應列的上一行的值。這里dp[i] = dp[i - 1] + dp[i];
代碼public class Solution { public int uniquePaths(int m, int n) { int[] dp = new int[n]; for(int i = 0; i < m; i++){ for(int j = 0; j < n; j++){ // 每一行的第一個數都是1 dp[j] = j == 0 ? 1 : dp[j - 1] + dp[j]; } } return dp[n - 1]; } }Unique Paths II
動態規劃 復雜度Follow up for "Unique Paths":
Now consider if some obstacles are added to the grids. How many unique paths would there be?
An obstacle and empty space is marked as 1 and 0 respectively in the grid.
For example, There is one obstacle in the middle of a 3x3 grid as illustrated below.
[ [0,0,0], [0,1,0], [0,0,0] ]The total number of unique paths is 2.
Note: m and n will be at most 100.
時間 O(NM) 空間 O(NM)
思路解法和上題一模一樣,只是要判斷下當前格子是不是障礙,如果是障礙則經過的路徑數為0。需要注意的是,最上面一行和最左邊一列,一旦遇到障礙就不再賦1了,因為沿著邊走的那條路徑被封死了。
代碼public class Solution { public int uniquePathsWithObstacles(int[][] obstacleGrid) { int m = obstacleGrid.length, n = obstacleGrid[0].length; int[][] dp = new int[m][n]; for(int i = 0; i < m; i++){ if(obstacleGrid[i][0] == 1) break; dp[i][0] = 1; } for(int i = 0; i < n; i++){ if(obstacleGrid[0][i] == 1) break; dp[0][i] = 1; } for(int i = 1; i < m; i++){ for(int j = 1; j < n; j++){ dp[i][j] = obstacleGrid[i][j] != 1 ? dp[i-1][j] + dp[i][j-1] : 0; } } return dp[m-1][n-1]; } }一維數組 復雜度
時間 O(NM) 空間 O(N)
思路和I中的空間優化方法一樣,不過這里判斷是否是障礙物,而且每行第一個點的值取決于上一行第一個點的值。
代碼public class Solution { public int uniquePathsWithObstacles(int[][] obstacleGrid) { int[] dp = new int[obstacleGrid[0].length]; for(int i = 0; i < obstacleGrid.length; i++){ for(int j = 0; j < obstacleGrid[0].length; j++){ dp[j] = obstacleGrid[i][j] == 1 ? 0 : (j == 0 ? (i == 0 ? 1 : dp[j]) : dp[j - 1] + dp[j]); } } return dp[obstacleGrid[0].length - 1]; } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64447.html
摘要:題目要求這是題目系列。存在路障的節點會在數組中被標記為。請問從起點到終點有多少條獨立路徑。思路和代碼在的思路基礎上,我們可以知道,如果某個節點上存在路障,那么任何從該節點前往終點的路徑都將不存在。也就是說,該節點的路徑數為。 題目要求 Follow up for Unique Paths: Now consider if some obstacles are added to the...
摘要:問一共有多少條獨特的路線思路一通過遞歸實現計算。思路二楊輝三角在思路的指引下,我們可以嘗試將遞歸的方法改變為循環的方法來解決。我們只需要確定在總部數中哪些步數右行或是哪些步數下行即可知道其對應的路徑。這里運用到排列組合的思想。 題目要求 A robot is located at the top-left corner of a m x n grid (marked Start in ...
摘要:和完全一樣的做法,只要在初始化首行和首列遇到時置零且即可。對了,數組其它元素遇到也要置零喏,不過就不要啦。 Problem Follow up for Unique Paths: Now consider if some obstacles are added to the grids. How many unique paths would there be? An obstacle...
摘要:簡單的動規題目,建立數組。坐標為矩陣的坐標,值為從左上角到這一格的走法總數。賦初值,最上一行和最左列的所有格子的走法都只有一種,其余格子的走法等于其左邊格子走法與上方格子走法之和。最后,返回即可。 Problem A robot is located at the top-left corner of a m x n grid (marked Start in the diagram ...
摘要:一組重復的文件至少包括二個具有完全相同內容的文件。如果,則表示該目錄是根目錄。該輸出是重復文件路徑組的列表。文件路徑是具有下列格式的字符串示例輸入輸出注最終輸出不需要順序。給定的文件數量在,個范圍內。 題目地址:https://leetcode-cn.com/probl...題目描述:給定一個目錄信息列表,包括目錄路徑,以及該目錄中的所有包含內容的文件,您需要找到文件系統中的所有重復文...
閱讀 3584·2021-11-04 16:06
閱讀 3579·2021-09-09 11:56
閱讀 846·2021-09-01 11:39
閱讀 896·2019-08-29 15:28
閱讀 2294·2019-08-29 15:18
閱讀 830·2019-08-29 13:26
閱讀 3333·2019-08-29 13:22
閱讀 1046·2019-08-29 12:18