62. Unique Paths

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?


Above is a 3 x 7 grid. How many possible unique paths are there?


第一印象可以用递归回溯的方法解决问题。但是提交的时候超时了。该方法不可求。

class Solution {
public:
    bool helper(vector<vector<bool> > &flag,int row, int col,int maxrow, int maxcol)
    {
      if(row == maxrow-1&&maxcol-1 == col){
          count ++;
          return true;
      }
      
      if(row >= maxrow||col >= maxcol||flag[row][col]){
          return false;
      }
      
      flag[row][col] = true;
      helper(flag,row,col+1,maxrow,maxcol);
      helper(flag,row+1,col,maxrow,maxcol);
      flag[row][col] = false;
      return true;
    }
    int uniquePaths(int m, int n) {
        vector<vector<bool> > flag(m,vector<bool>(n,false));
        count = 0;
        helper(flag,0,0,m,n);
        return count;
};

第二种方法就是利用动态规划,因为题目中要求只能向下和向右移动,所以可以利用两个数组,保存同一列和左边一列的数据就可以了。利用pre保存前一列的数据,cur保存当前列的数据。所以可以通过交换后,当前列变成后一列。


class Solution {
public:
    int uniquePaths(int m, int n) {
        if(m > n) return uniquePaths(n,m);
        vector<int> cur(m,1);
        for(int j = 1; j < n; j++)
        {
             for(int i = 1; i < m; i++)
             {
              cur[i] = cur[i-1] + pre[i];
             }
              swap(cur,pre);
         }
           return pre[m-1];
        }
};

具体分析以后该题中的pre数组是多余的,因为可以利用cur[i]保存前一列的数据,这样在递归的过程中不会被覆盖。


class Solution {
public:
    int uniquePaths(int m, int n) {
        if(m > n) return uniquePaths(n,m);
        vector<int> cur(m,1);
        for(int j = 1; j < n; j++)
        {
             for(int i = 1; i < m; i++)
             {
              cur[i] += cur[i-1];// + pre[i];
             }
         }
           return cur[m-1];
        }
};

但是不可以用两个变量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值