62、63 不同路径
62. 不同路径
// nums[3][7] 记录 start -> 任意位置的路径数
for(int i=0;i<m;i++){nums[0][i] = 1;
}
同理,start(0,0) -> (2,6) 只有一种可能,那就是一直往下。
同理,(0,0) -> 第一列的任何一个位置都只有一种情况。
for(int i=0;i<n;i++){nums[i][0] = 1;}
我们把 (0,0) -> 到任何一个位置的路径数标到方格上,即:
for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(i==0 || j==0) continue;nums[i][j] = nums[i][j-1] + nums[i-1][j];}}
解法一:
// 完整代码
class Solution {public int uniquePaths(int m, int n) {// nums[3][7] 记录 start -> 任意位置的路径数int[][] nums = new int[m][n];for(int i=0;i<m;i++){nums[i][0] = 1; }for(int i=0;i<n;i++){nums[0][i] = 1;}for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(i==0 || j==0) continue;nums[i][j] = nums[i][j-1] + nums[i-1][j];}}return nums[m-1][n-1];}
}
解法二:
根据:nums[i][j] = nums[i][j-1] + nums[i-1][j]
可以得知nums[i][j]
是由(上一行和本行的)旧数据推导而出,并且我们最终只需要finial 位置的路径数,无需其他旧数据。
所以可以简化空间,将int[m][n]
优化为int[n]
。
所以:
class Solution {public int uniquePaths(int m, int n) {int[] nums = new int[n];// 初始第一行均为1Arrays.fill(nums,1);for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(i==0 || j==0) continue;nums[j] += nums[j-1];}}return nums[n-1];}
}
63. 不同路径 II
相较于上一题
,多了障碍物
所以:
第一行:如果不出现障碍物均为1,出现障碍物的话障碍物前为1 其他为0(因为无法到达)
for(int i=0; i<m; i++){if(obstacleGrid[0][i] == 1) break;nums[0][i] = 1;
}
第一列:如果不出现障碍物均为1,出现障碍物的话障碍物前为1 其他为0(因为无法到达)
for(int i=0; i<m; i++){if(obstacleGrid[i][0] == 1) break;nums[i][0] = 1;
}
其他空格:如果本位置不出现障碍物nums[i][j] = nums[i][j-1] + nums[i-1][j]
,如果出现障碍物的话为0
for(int i=0; i<m; i++){for(int j=0; j<n; j++){if(i==0 || j==0) continue;if(obstacleGrid[i][j] == 0){nums[i][j] = nums[i-1][j] + nums[i][j-1];}}
}
解法一:
class Solution {public int uniquePathsWithObstacles(int[][] obstacleGrid) {int m = obstacleGrid.length;int n = obstacleGrid[0].length;int[][] nums = new int[m][n];for(int i=0; i<m; i++){if(obstacleGrid[i][0] == 1) break;nums[i][0] = 1;}for(int i=0; i<n; i++){if(obstacleGrid[0][i] == 1) break;nums[0][i] = 1;}for(int i=0; i<m; i++){for(int j=0; j<n; j++){if(i==0 || j==0) continue;if(obstacleGrid[i][j] == 0){nums[i][j] = nums[i-1][j] + nums[i][j-1];}}}return nums[m-1][n-1];}
}
解法二:
同样可以得到:
根据nums[i][j] = nums[i][j-1] + nums[i-1][j]
可以得知nums[i][j]
是由(上一行和本行的)旧数据推导而出,并且我们最终只需要finial 位置的路径数,无需其他旧数据。
所以可以简化空间,将int[m][n]
优化为int[n]
。
所以:
/**
解法二:压缩数组
由解法一 “nums[i][j] = nums[i][j-1] + nums[i-1][j];如若出现障碍物即为0” 得旧数据仅仅用于下一行的累加,即旧数据没有被存储的必要。可以简化为一维数组,即 nums[j] += nums[j-1]; 如若出现障碍物即为0。
需要注意的是nums[0]的值,即当(obstacleGrid)第一列若某元素出现障碍物,之后的元素便都为0了,所以需要额外判断nums[0]
**/class Solution {public int uniquePathsWithObstacles(int[][] obstacleGrid) {int m = obstacleGrid.length;int n = obstacleGrid[0].length;int[] nums = new int[n];for(int j=0; j<n; j++){if(obstacleGrid[0][j] == 1) break;nums[j] = 1;}nums[0] = 1;for(int i=0; i<m; i++){for(int j=0; j<n; j++){// 需要额外判断nums[0]if(nums[0] == 1){if(j==0 && obstacleGrid[i][j] == 1){nums[0] = 0;}}if(i==0 || j==0) continue;if(obstacleGrid[i][j] == 0){nums[j] += nums[j-1];}else{nums[j] = 0;}}}return nums[n-1];}
}
62、63 不同路径相关推荐
- LeetCode-动态规划基础题-63. 不同路径II
描述 63. 不同路径II 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为"Start" ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角 ...
- 63. 不同路径 II【动态规划】
63.不同路径 II 题目链接:https://leetcode-cn.com/problems/unique-paths-ii/ 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 ...
- 《LeetCode力扣练习》第62题 不同路径 Java
<LeetCode力扣练习>第62题 不同路径 Java 一.资源 题目: 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 "Start" ). ...
- LeetCode:63. 不同路径 II
题目链接 63. 不同路径 II 题目描述 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为"Start" ). 机器人每次只能向下或者向右移动一步.机器人试图 ...
- leetcode题库--63不同路径 II
不同路径 这题就是一个组合问题. int fun(int num){int ans = 1;while(num){ans*=num;num--;}return ans;}int uniquePaths ...
- Java实现 LeetCode 63 不同路径 II(二)
63. 不同路径 II 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为"Start" ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在 ...
- leetcode 62, 63, 980. Unique Paths I, II, III | 62, 63, 980. 不同路径 I, II, III(暴力递归->傻缓存->动态规划)
62. Unique Paths https://leetcode.com/problems/unique-paths/ 注意本题只能向右 / 向上走. DP 问题,经典又熟悉. 暴力递归->傻 ...
- leetcode菜狗入门 | 62. 不同路径 63. 不同路径 II
不同路径 题目描述 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为"Start" ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图 ...
- 跟我打卡LeetCode 61旋转链表62不同路径63不同路径 II
原创公众号:bigsai 关注后回复进群即可加入力扣打卡群,欢迎划水.近期打卡: LeetCode 49字母异位词分组&50pow(x,n)&51八皇后 LeetCode打卡 52八皇 ...
最新文章
- 如何编写一个可升级的智能合约
- ssh mysql 警告_ssh 对数据表查询出错。警告: SQL Error: 1064, SQLState: 42000
- SQL查询入门(中篇)
- 360 开源企业级 Kubernetes 多集群管理平台 Wayne
- 【Linux】27.Markdown的用法
- django Admin
- 运行npm update等命令出错后如何分析问题根源
- laravel 关联关系之多态关联
- [转载]LM算法的实现
- 存算分离架构的高斯Redis,用强一致提供可靠保障
- jQuery mobile button 禁用和启用
- python可以和java共存吗_python3 and python2 共存
- C++写的B+树源码
- 有的放矢,Liferay进军数字体验市场
- 数字逻辑课设(数字电子钟)
- linux全角半角切换,教您输入法全角和半角怎么切换
- XiaoHu日志 4/17
- socket通信项目开源c语言,优秀的国产高性能TCP/UDP/HTTP开源网络通信框架——HP-Socket...
- Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/account
- 大数据岗位面试失败的经历总结,这些面试的坑莫在踩