昨天和朋友聊聊下大三下的实习,实习面试的时间大家都打算安排在十月底到十一月。之后谈谈面试的Java技术点和算法,发现自己现在还有很多不懂,LeetCode刷的也远远不够。因此打算这个月突击准备面试,然后按照 Tags 刷LeetCode Hot 100。在写本篇文章之前大致刷了十几道 Array Tag 的题,本来是打算刷完一次性做一个总结的,但是发现遗忘程度太快。因此计划写一篇LeetCode Array 专题,每刷一题,就总结一次。
classSolution{ publicintuniquePaths(int m, int n){ // 递归查询 int number = 0; number = findFinish(1 , 1 , m , n , number); return number; }
publicintfindFinish(int x,int y,int m, int n,int number){ if( x == m && y == n){ number ++; return number; } if( x < m ){ number = findFinish(x + 1 , y , m , n, number); } if( y < n ){ number = findFinish(x , y + 1 , m , n, number); } return number; }
}
解题思路
看到这题,我的第一想法就是递归,花了十几分钟,快速把代码写了,顺利通过了测试,但是提交时显示超时。
看了一下题解,发现原因是递归时,进行了大量重复的计算,如图所示
解决方法:用一个 map 存放重复计算的点, key 为 i * j,value 为到当前点的路径数
方法二:动态规划
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
classSolution{ publicintuniquePaths(int m, int n){ // 动态规划 // 我觉得思想其实和我用递归差不多,但是使用数组进行存储,就避免了多余的计算存储 int res[][] = newint[m][n]; for(int i = 0; i < m; i ++) res[i][0] = 1; for(int j = 0; j < n; j ++) res[0][j] = 1; for(int i = 1 ; i < m ; i ++){ for(int j = 1; j < n ; j ++){ // 核心方程 res[i][j] = res[i - 1][j] + res[i][j - 1]; } }