leetcode 62, 63, 980. Unique Paths I, II, III | 62, 63, 980. 不同路径 I, II, III(暴力递归->傻缓存->动态规划)
62. Unique Paths
https://leetcode.com/problems/unique-paths/
注意本題只能向右 / 向上走。
DP 問題,經(jīng)典又熟悉。
暴力遞歸->傻緩存->動(dòng)態(tài)規(guī)劃。
class Solution {int M, N;public int uniquePaths(int m, int n) {M = m;N = n;// Approach 1: Recursive, Brute Force // return process1(0, 0);// Approach 2: Recursion with Memoization // int[][] dp = new int[M][N]; // dp[M - 1][N - 1] = 1; // return process2(0, 0, dp);// Approach 3: Dynamic Programmingint[][] dp = new int[M][N];for (int i = M - 1; i >= 0; i--) {dp[i][N - 1] = 1;}for (int j = N - 1; j >= 0; j--) {dp[M - 1][j] = 1;}for (int i = M - 2; i >= 0; i--) {for (int j = N - 2; j >= 0; j--) {dp[i][j] = dp[i + 1][j] + dp[i][j + 1];}}return dp[0][0];}// public int process2(int i, int j, int[][] dp) { // 從i,j到M,N共有多少種路徑 // if (i == M || j == N) return 0; // if (dp[i][j] > 0) return dp[i][j]; // dp[i][j] = process2(i + 1, j, dp) + process2(i, j + 1, dp); // return dp[i][j]; // }// public int process1(int i, int j) { // if (i == M || j == N) return 0; // if (i == M - 1 && j == N - 1) return 1; // return process1(i + 1, j) + process1(i, j + 1); // } }63. Unique Paths II
https://leetcode.com/problems/unique-paths-ii/
DP 問題,同上題,注意本題只能向右 / 向上走,只不過多了一些障礙物。
暴力遞歸->傻緩存->動(dòng)態(tài)規(guī)劃。
980. Unique Paths III
https://leetcode.com/problems/unique-paths-iii/
本題是有史以來(lái)做過的最簡(jiǎn)單的 hard 了,就是一個(gè)沒有任何優(yōu)化技巧的 backtracing,30分鐘搞定。
思路如下:因?yàn)?exactly once 語(yǔ)義,所以不能走重復(fù)路線,故維護(hù)一個(gè) visited 數(shù)組。另外維護(hù)一個(gè) remain 代表剩余步數(shù),當(dāng)經(jīng)過終點(diǎn)時(shí),看剩余步數(shù)是否恰好為0,或者當(dāng)剩余步數(shù)為 0 時(shí),看是否恰好經(jīng)過終點(diǎn)。否則沒有必要繼續(xù)走下去。
總結(jié)
以上是生活随笔為你收集整理的leetcode 62, 63, 980. Unique Paths I, II, III | 62, 63, 980. 不同路径 I, II, III(暴力递归->傻缓存->动态规划)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: leetcode 130. Surrou
- 下一篇: Gitee ssh 公钥配置好后,仍然