Leetcode_62_Unique Paths

来源:互联网 发布:grub安装ubuntu 编辑:程序博客网 时间:2024/06/05 18:57

本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/43404205



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)题意为给定m行n列,求从第0行第0列走到第m行第n列的路径有多少条。

(2)对于本题,首先想到的是通过递归来实现,当行数为1或者列数为1时,路径只有一条;我们先从行开始,假设从第1行第1列元素开始,向右到达右下角,则可以看做是去除第一列后剩余行列对应路径,以函数f(m,n)表示路径条数,则有f(m,n)=f(1,n-1)+f(2,n-1),...,+f(n,n-1),而f(1,n)=f(m,1)=1,则通过递归即可得到答案,只是递归效率太低,Oj肯定会超时,所以,不能选用这种方法。

(3)考虑到m行n列正好对应一个二位数组,而我们发现f(1,n)=f(m,1)=1,所以,我们对整个二维数组进行拆分,假设拆分第一行,则第一行中任意位置作为终点对应的条数都为1,同理拆分第一列也是;这样,对应二维数组的第一行第一列的值就都为1了;假设数组为2*2,则我们发现到达右下角的路径数为f(2,2)=2=f(2,1)+f(1,2),正好为该位置对应上方和左方值之和;同理,当数组为3*3时,f(3,3)=6=f(3,2)+f(2,3)={f(3,1)+f(2,2)}+{f(1,3)+f{2,2}}={1+f(1,1)+f(1,1)}+{1+f(1,1)+f(1,1)}=6;同理,当数组为m*n时,f(m,n) = f(m-1,n)+f(m,n-1)=.......。所以,我们只需要对二维数组中每个位置遍历赋值即可得到最后的结果,详情见下方代码。

(4)希望本文对你有所帮助。


算法代码实现如下:

/** * @liqq 递归算法能够实现 但是会超时 oj不通过 */public static int get(int row, int col){if(row<=0 || col <=0) return 0;if(row==1) return 1;if(col==1) return 1;int result = 0;for (int i = 1; i <=row; i++) {result+=get(i,col-1);}return result;}

/** * @author 二维数组实现 */public static int getResult(int m, int n){int[][] arr   = new int[m][n];for (int i = 0; i < m; i++) {arr[i][0]=1;}for (int i = 0; i < n; i++) {arr[0][i]=1;}for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {arr[i][j]=arr[i-1][j]+arr[i][j-1];}}return arr[m-1][n-1];}


2 0
原创粉丝点击