62. 不同路径

题目求start -> finish的路径总数。因为只能向下或者向右,所以很显然例题中start(0,0) -> (0,6) 只有一种可能,那就是一直往右。
同理,(0,0) -> 第一行的任何一个位置都只有一种情况。

// 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) -> 到任何一个位置的路径数标到方格上,即:


因为只能向下或者向右,那么 start -> (1,1) 的路径总数有:
(0,0) -> (0,1) ->(1,1)
(0,0) -> (1,0) ->(1,1)
也就是count( (1,0) ) + count( (0,1) ) = 1+1 =2
所以剩下的空格便可以通过上边和左边推出。

 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];}}

那么,答案便是 finial(2,6)位置对应的值。

解法一:
// 完整代码
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 不同路径相关推荐

  1. LeetCode-动态规划基础题-63. 不同路径II

    描述 63. 不同路径II 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为"Start" ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角 ...

  2. 63. 不同路径 II【动态规划】

    63.不同路径 II 题目链接:https://leetcode-cn.com/problems/unique-paths-ii/ 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 ...

  3. 《LeetCode力扣练习》第62题 不同路径 Java

    <LeetCode力扣练习>第62题 不同路径 Java 一.资源 题目: 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 "Start" ). ...

  4. LeetCode:63. 不同路径 II

    题目链接 63. 不同路径 II 题目描述 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为"Start" ). 机器人每次只能向下或者向右移动一步.机器人试图 ...

  5. leetcode题库--63不同路径 II

    不同路径 这题就是一个组合问题. int fun(int num){int ans = 1;while(num){ans*=num;num--;}return ans;}int uniquePaths ...

  6. Java实现 LeetCode 63 不同路径 II(二)

    63. 不同路径 II 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为"Start" ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在 ...

  7. 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 问题,经典又熟悉. 暴力递归->傻 ...

  8. leetcode菜狗入门 | 62. 不同路径 63. 不同路径 II

    不同路径 题目描述 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为"Start" ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图 ...

  9. 跟我打卡LeetCode 61旋转链表62不同路径63不同路径 II

    原创公众号:bigsai 关注后回复进群即可加入力扣打卡群,欢迎划水.近期打卡: LeetCode 49字母异位词分组&50pow(x,n)&51八皇后 LeetCode打卡 52八皇 ...

最新文章

  1. 如何编写一个可升级的智能合约
  2. ssh mysql 警告_ssh 对数据表查询出错。警告: SQL Error: 1064, SQLState: 42000
  3. SQL查询入门(中篇)
  4. 360 开源企业级 Kubernetes 多集群管理平台 Wayne
  5. 【Linux】27.Markdown的用法
  6. django Admin
  7. 运行npm update等命令出错后如何分析问题根源
  8. laravel 关联关系之多态关联
  9. [转载]LM算法的实现
  10. 存算分离架构的高斯Redis,用强一致提供可靠保障
  11. jQuery mobile button 禁用和启用
  12. python可以和java共存吗_python3 and python2 共存
  13. C++写的B+树源码
  14. 有的放矢,Liferay进军数字体验市场
  15. 数字逻辑课设(数字电子钟)
  16. linux全角半角切换,教您输入法全角和半角怎么切换
  17. XiaoHu日志 4/17
  18. socket通信项目开源c语言,优秀的国产高性能TCP/UDP/HTTP开源网络通信框架——HP-Socket...
  19. Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/account
  20. 大数据岗位面试失败的经历总结,这些面试的坑莫在踩

热门文章

  1. mysql 交叉表 存储过程_SQL存储过程实现SPSS交叉表(有图有真相)
  2. BZOJ 4873 [Shoi2017]寿司餐厅 | 网络流 最大权闭合子图
  3. uniapp关闭默认返回安卓和ios
  4. 30个优秀的CSS导航菜单和按钮教程
  5. 小米手机动态修改imei信息
  6. 魔兽争霸3在Windows7中运行可能遇到的问题
  7. 全国低于30ms响应速度:千万级魅族用户的异地多点网络架构如何优化
  8. Linux使用fdisk分区扩容
  9. 最简单的免费修改PDF文件方法
  10. 3dMax DTS Exporter附带说明文档