漯河网站建设兼职,58做网站,做手机网站尺寸,如何给企业做网站推广和上一道题#xff08;无障碍物的最短路径#xff09;很像#xff0c;但事实上比上一题多了优化方法
根据上一题改的代码如下#xff0c;添加了对障碍物的判定#xff0c;如果有障碍物则将数组值设为0。
class Solution {
public:int uniquePathsWithObstacles(vector无障碍物的最短路径很像但事实上比上一题多了优化方法
根据上一题改的代码如下添加了对障碍物的判定如果有障碍物则将数组值设为0。
class Solution {
public:int uniquePathsWithObstacles(vectorvectorint obstacleGrid) {int mobstacleGrid.size();int nobstacleGrid[0].size();int a[m][n];for(int i0;im;i) for(int j0;jn;j) a[i][j]0;for(int i0;inobstacleGrid[0][i]0;i) a[0][i]1;for(int i0;imobstacleGrid[i][0]0;i) a[i][0]1;for(int i1;im;i){for(int j1;jn;j){if(obstacleGrid[i][j]0) a[i][j]a[i-1][j]a[i][j-1];}}return a[m-1][n-1];}
};
然后看了答案答案说可以使用滚动数组优化就又去搜了一下滚动数组的使用方法。
参考了一下63. 不同路径 II(C)---动态规划解题(并进行滚动数组思想优化)琢磨了一下代码原理是将上面的二维数组优化成了一维记录开始位置到达每一行末尾的路径数。如有障碍物则直接将数目设为0然后继续遍历这一行没有障碍物就将数目设为上一行路径数加上这一行路径数。
需要注意的是遍历方向按照上面这种思路需要先遍历列再遍历行如果先遍历行如果上一行末尾有障碍物那么下一行就通过不了。
class Solution {
public:int uniquePathsWithObstacles(vectorvectorint obstacleGrid) {int mobstacleGrid.size();int nobstacleGrid[0].size();vectorint a(m);a[0]!obstacleGrid[0][0];for(int j0;jn;j){for(int i0;im;i){if(obstacleGrid[i][j]) a[i]0;else if(i0!obstacleGrid[i-1][j]) a[i]a[i-1];couti j a[i]endl;}}return a[m-1];}
};
感觉这个方法很熟悉前几天的一道题也用过这种思路虽然也是看答案知道的就是了