[关闭]
@LIUHUAN 2020-06-30T23:25:09.000000Z 字数 1869 阅读 672

唯一路径个数从递归到迭代

algorithm


唯一路径个数

方法一:递归

  1. int uniquePaths(int m, int n) { return dfs(m, n); }
  2. int dfs(int m, int n) {
  3. if (m == 1 || n == 1) {
  4. return 1;
  5. }
  6. return dfs(m - 1, n) + dfs(m, n - 1);
  7. }

方法二:转化为备忘录递归

  1. unordered_map<string, int> cache;
  2. int uniquePaths(int m, int n) {
  3. return memo(m, n);
  4. return dfs(m, n);
  5. }
  6. int memo(int m, int n) {
  7. if (m == 1 || n == 1) {
  8. return 1;
  9. }
  10. auto key = getkey(m, n);
  11. if (cache.find(key) != cache.end()) {
  12. return cache[key];
  13. }
  14. auto x = memo(m - 1, n) + memo(m, n - 1);
  15. cache[key] = x;
  16. return x;
  17. }
  18. string getkey(int m, int n) {
  19. return to_string(m) + "_" + to_string(n);
  20. }

方法三:唯一路径个数(转化为迭代计算)

  1. int uniquePaths(int m, int n) {
  2. return dyp(m, n);
  3. }
  4. int dyp(int m, int n) {
  5. vector<vector<int>> dp(m, vector<int>(n, 0));
  6. for (int i = 0; i < m; i++) {
  7. dp[i][0] = 1;
  8. }
  9. for (int j = 0; j < n; j++) {
  10. dp[0][j] = 1;
  11. }
  12. for (int i = 1; i < m; i++) {
  13. for (int j = 1; j < n; j++) {
  14. dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
  15. }
  16. }
  17. return dp[m - 1][n - 1];
  18. }

空间优化

  1. int uniquePaths(int m, int n) {
  2. return dypopt(m, n);
  3. }
  4. int dypopt(int m, int n) {
  5. vector<int> pre(n, 1), cur(n, 1);
  6. for (int i = 1; i < m; i++) {
  7. for (int j = 1; j < n; j++) {
  8. cur[j] = cur[j - 1] + pre[j];
  9. }
  10. swap(pre, cur);
  11. }
  12. return pre[n - 1];
  13. }

其他

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注