思路:m*n个方块,只能向右或者下,可以理解成有(m-1)个向右的动作和(n-1)个向下的动作,找到所有的可能性,这个问题又等价于依次排列的m(确定是m没有打错)个箱子,有(n-1)个小球随意的放置,求可能性。本来使用的是List<List<Integer>>数组求最后的size,这个list中的每个list即是一种可能性,产生的方式为,每个表示可能性的list中查看其最后一个值,然后添加从其最后一个值到m个 新list进总list中,删除原来的list,直到每个list的长度都为n-1,即小球被分发完毕,但是后来发现该方法超时,于是更换成map
public class Solution {
public int uniquePaths(int m, int n) {
if (m==1||n==1) {
return 1;
}
Map<Integer,Integer> map=new HashMap<Integer, Integer>();
for (int i = 0; i < m; i++) {
map.put(i, 1);
}
for (int i = 1; i < n-1; i++) {
int sum=0;
for (int j = m-1; j >=0; j--) {
sum+=map.get(j);
}
int k=map.get(m-1);
for (int j = m-1; j >=0; j--) {
map.put(j, sum);
sum-=k;
if (j>1) {
k=map.get(j-1);
}
}
}
int sum=0;
for (int i = 0; i < m; i++) {
sum+=map.get(i);
}
return sum;
}
}
耗时:240ms,下游水准。悲剧的是看了一下63题,感觉我这个思路完全用不上。