码迷,mamicode.com
首页 > 其他好文 > 详细

Unique Paths -- leetcode

时间:2015-04-04 13:47:15      阅读:135      评论:0      收藏:0      [点我收藏+]

标签:面试   leetcode   路径   动态规划   

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?

Note: m and n will be at most 100.




1,动态规划

在leetcode上实际运行时间为5ms。时间复杂度为O(m*n)

到达一个点,有两个途径,从左方,和上方。即到达一个点路径数为到达其左邻居路径数+到达其上方邻居路径数。

由于到达每行第一列的路径数,总为1。 故只需要保存上一行的路径数即可。 空间复杂度为O(n)。而不需要O(m*n)

当然,每一列的第一行,也总为1。只需要保存上一列也可。

如果要省空间的话,可以选择m,n较小者。 不过此题无所谓,m,n都很小。

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


2. 组合方法

到达终点,共需要m-1次向下移动,n-1次向右移动。 

即一共需要m+n-2次移动。

此问题可以转换为,在m+2-2次移动步数中,选择第k步为向下移动,一共选出m-1步。 一组选择,即为一个条路径。由此就转换为一个组合问题。

时间复杂度为O(min(m,n)),空间复杂度为O(1)

在leetcode上实际执行时间为2ms。


class Solution {
public:
    int uniquePaths(int m, int n) {
        int small = min(m, n);
        int large = max(m, n);
        long long result = 1, mul = 1;
        while (--small) {
            mul *= small;
            result *= large + small - 1;
        }
        return result / mul;
    }
};





Unique Paths -- leetcode

标签:面试   leetcode   路径   动态规划   

原文地址:http://blog.csdn.net/elton_xiao/article/details/44871789

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!