首页 > 其他 > 详细

leetcode--Unique Paths

时间:2015-05-16 20:38:49      阅读:394      评论:0      收藏:0      [点我收藏+]

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.

解题思路:

机器人走n+m-2步到达终点,其中n-1向右,m-1向下。所以共有Cm-1m+n-2种方法。

方法一:

利用杨辉三角

排列信息编辑

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
                          1
                         1   1   
                       1   2   1   
                     1   3   3   1   
                   1   4   6   4   1   
                 1   5   10  10  5   1   
               1   6   15  20  15  6   1   
             1   7   21  35  35  21  7   1   
           1   8   28  56  70  56  28  8   1   
         1   9   36  84  126 126 84  36  9   1   
       1   10  45  120 210 252 210 120 45  10  1   
     1   11  55  165 330 462 462 330 165 55  11  1    
   1   12  66  220 495 792 924 792 495 220 66  12  1
...
1, C(n-1,1), C(n-1,2), …, C(n-1,n-1)
 
以上即为杨辉三角的排列性质。
前提:端点的数为1.
  1. 每个数等于它上方两数之和。
  2. 每行数字左右对称,由1开始逐渐变大。
  3. 第n行的数字有n项。
  4. 第n行数字和为2n-1
  5. 第n行的m个数可表示为 C(n-1,m-1),即为从n-1个不同元素中取m-1个元素的组合数。
  6. 第n行的第m个数和第n-m+1个数相等 ,为组合数性质之一。
  7. 每个数字等于上一行的左右两个数字之和。可用此性质写出整个杨辉三角。即第n+1行的第i个数等于第n行的第i-1个数和第i个数之和,这也是组合数的性质之一。即 C(n+1,i)=C(n,i)+C(n,i-1)
  8. (a+b)n的展开式中的各项系数依次对应杨辉三角的第(n+1)行中的每一项。[1] 
  9. 将第2n+1行第1个数,跟第2n+2行第3个数、第2n+3行第5个数……连成一线,这些数的和是第4n+1个斐波那契数;将第2n行第2个数(n>1),跟第2n-1行第4个数、第2n-2行第6个数……这些数之和是第4n-2个斐波那契数。
  10. 将各行数字相排列,可得11的n-1(n为行数)次方:1=11^0; 11=11^1; 121=11^2……当n≥5时会不符合这一条性质,此时应把第n行的最右面的数字"1"放在个位,然后把左面的一个数字的个位对齐到十位... ...,以此类推,把空位用“0”补齐,然后把所有的数加起来,得到的数正好是11的n-1次方。以n=11为例,第十一行的数为:1,10,45,120,210,252,210,120,45,10,1,结果为 25937424601=1110
根据杨辉三角的第五个性质
  1. 第n行的m个数可表示为 C(n-1,m-1),即为从n-1个不同元素中取m-1个元素的组合数。
我们求得杨辉三角,取里面第(n+m-1)行的第(m)列数字就是我要求的Cm-1m+n-2。代码中,杨辉三角二维表的下标从零开始,故我们找下标为[n+m-2][m-1]的数即可
代码如下:
 int uniquePaths(int m, int n) {
        if (m<1||n<1) return 0;
	if((m==1)||(n==1))  return  1;
	vector<vector<int>>  yanghui;
	vector<int> temp(1,1);
	yanghui.push_back(temp);
	for (int i=1;i<=(n+m-2);i++)
	{
		vector<int> temp1(i+1,0);
		temp1[0]=1;
		temp1[i]=1;
		for (int j=1;j<i;j++)
		{
			temp1[j]=yanghui[i-1][j-1]+yanghui[i-1][j];
		}
		yanghui.push_back(temp1);
	}
	return yanghui[n+m-2][m-1];
        
    }

方法二

因为题目中要求 m and n will be at most 100.所以我们可以直接化简计算Cm-1m+n-2。代码如下:
int uniquePaths(int m, int n) {
        int N = n + m - 2;// how much steps we need to do
            int k = m - 1; // number of steps that need to go down
            double res = 1;
            // here we calculate the total possible path number 
            // Combination(N, k) = n! / (k!(n - k)!)
            // reduce the numerator and denominator and get
            // C = ( (n - k + 1) * (n - k + 2) * ... * n ) / k!
            for (int i = 1; i <= k; i++)
                res = res * (N - k + i) / i;
            return round(res);//四舍五入,利用math.round()函数。
        
    }





leetcode--Unique Paths

原文:http://blog.csdn.net/sinat_24520925/article/details/45769317

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!