LeetCode---UniquePaths
先放下原题描述:
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.我开开心心地写了一个递归,结果运行超时= =#,好吧,看来时间阈值的意义是不允许我们使用递归,只能迭代了;
2.空间复杂度为O(mn)的做法:开辟一个m×n的二维数组,每个元素存储到达该元素的方法数。例如数组名为Records,records[i][j]=records[i-1][j]+records[i][j-1];(i>=1,j>=1,第一行和第一列应初始化为1,同时每行逐列扫描更新值);
3.大师说不去优化的代码不是好代码。(But,宝宝没有思路,这个思路是借鉴别人滴):空间复杂度为O(n)的方法(降低了好多数量级):(1),第n行的状态只和前一行有关;(2),能够利用该行成功更新下一行并且不丢值;建立一维数组records[n],初始值全为1,利用公式records[j]+=records[j-1];来更新值。同时,要循环m-1次,最后返回值为records[n-1];可画图分析下为什么该公式可以得到正确的值;
贴上代码:
public class UniquePaths { public static int uniquePaths(int m, int n) { if(m==1||n==1)return 1; int[] records=new int[n];
//发现了一个新方法:用来初始化数组;Arrays工具类; Arrays.fill(records, 1); for(int i=1;i<m;i++) for(int j=1;j<n;j++) records[j]+=records[j-1]; return records[n-1]; } public static void main(String[] args) { System.out.println(uniquePaths(3,4)); } }