本文共 861 字,大约阅读时间需要 2 分钟。
思路: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; } Mapmap=new HashMap (); 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题,感觉我这个思路完全用不上。