• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
THE WAY I AM
博客园    首页    新随笔    联系   管理    订阅  订阅
62. Unique Paths不同路径
  • 网址:https://leetcode.com/problems/unique-paths/

第一思路是动态规划

通过观察,每一个格子的路线数等于相邻的左方格子的路线数加上上方格子的路线数

于是我们就得到 dp[i][j] = dp[i-1][j] + dp[i][j-1] 这个状态转移方程

  • 一开始通过调用函数的方式对dp数组赋值,并且每次都判断index是否为特殊值,感觉耗时会很多,果不其然!
 1 int get_sum(vector<vector<int>> dp, int i, int j, int m, int n)
 2 {
 3     if(j == 1 || i == 1)
 4         return 1;
 5     return dp[i-1][j] + dp[i][j-1];
 6 }
 7 int uniquePaths(int m, int n)
 8 {
 9     vector<vector<int>> dp(m+1,vector<int>(n+1,0));
10     dp[1][1] = -1;
11     for(int i=1; i<=m; i++)
12     {
13         for(int j=1; j<=n; j++)
14         {
15             dp[i][j] = get_sum(dp, i, j, m, n);
16         }
17     }
18     return dp[m][n];
19 }

  • 紧接着想到可以在一开始就对特殊位置赋值,并且从零开始index,少去了函数的调用以及每一次的判断流程,程序可以大幅度减少运行时间和占用空间!
  •  1 class Solution {
     2 public:
     3     int uniquePaths(int m, int n) {
     4         vector<vector<int>> dp(m,vector<int>(n,0));
     5         for(int i=0;i<m;i++)
     6             dp[i][0] = 1;
     7         for(int j=0;j<n;j++)
     8             dp[0][j] = 1;
     9         for(int i=1; i<m; i++)
    10         {
    11             for(int j=1; j<n; j++)
    12             {
    13                 dp[i][j] = dp[i-1][j] + dp[i][j-1];
    14             }
    15         }
    16         return dp[m-1][n-1];
    17     }
    18 };

     

posted on 2019-03-27 21:43  549  阅读(102)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3