1.动态规划
这道题和前一题基本一样,状态转移方程仍然是
dp[i][j]=dp[i-1][j-1]+dp[i][j-1].
区别在于当i,j不可达时,其值为0,且需要首先初始化dp的边界值。
代码如下:
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
int m=obstacleGrid.size(),n=obstacleGrid[0].size();
vector<vector<int>>dp(m,vector<int>(n,0));//初始化为0
//首先初始化边界
//上边界,障碍物及其后的位置都不可达
for(int i=0;i<n;i++)
if(obstacleGrid[0][i]==1)
{
for(int j=i;j<n;j++)
dp[0][j]=0;//
break;
}
else
dp[0][i]=1;
//左边界,障碍物及其下的位置都不可达
for(int i=0;i<m;i++)
if(obstacleGrid[i][0]==1)
{
for(int j=i;j<m;j++)
dp[j][0]=0;//
break;
}
else
dp[i][0]=1;
for(int i=1;i<m;i++)
for(int j=1;j<n;j++)
if(obstacleGrid[i][j]==1)//为障碍物
dp[i][j]=0;//表示不可达
else if(obstacleGrid[i][j]==0)
dp[i][j]=(long)dp[i-1][j]+(long)dp[i][j-1];//不使用long可能会溢出
return dp[m-1][n-1];
}
};
时间复杂度为O(m*n),空间复杂度为O(m*n)
另外,可以让obstacleGrid数组充当dp数组,因为判断完当前值是否是障碍物,修改obstacleGrid的值并不会影响最终的结果,这样空间复杂度为O(1).
来源:CSDN
作者:qq_38196982
链接:https://blog.csdn.net/qq_38196982/article/details/104733055