【每日刷题】Day113
🥕个人主页:开敲🍉
🔥所属专栏:每日刷题🍍
🌼文章目录🌼
1. 91. 解码方法 - 力扣(LeetCode)
2. LCR 098. 不同路径 - 力扣(LeetCode)
3. 63. 不同路径 II - 力扣(LeetCode)
1. 91. 解码方法 - 力扣(LeetCode)
//思路:动态规划。
class Solution {
public:
int numDecodings(string s)
{
//如果开头为 '0' ,则没有解码方法。
if(s[0]=='0') return 0;
int size = s.size();
vector<int> dp(size);
//初始化前两个位置的解码数
dp[0] = 1;
if(size==1) return dp[0];
if(s[1]!='0') dp[1]++;
//判断能否与前一个数共同解码
int num = (s[0]-'0')*10+s[1]-'0';
if(num>=10&&num<=26) dp[1]++;
for(int i = 2;i<size;i++)
{
int num = (s[i-1]-'0')*10+s[i]-'0';
//如果当前数字自身能够解码,则其解码数为前一个位置的解码数
if(s[i]!='0') dp[i]+=dp[i-1];
//如果当前数字能够与前一个位置解码,则其解码数为 i-2 位置的解码数
if(num>=10&&num<=26) dp[i]+=dp[i-2];
}
return dp[size-1];
}
};
2. LCR 098. 不同路径 - 力扣(LeetCode)
//思路:动态规划。
class Solution {
public:
int uniquePaths(int m, int n)
{
//多开一行和一列
vector<vector<int>> dp(m+1,vector<int>(n+1));
//[0][1]用于后续循环中初始化起点位置
dp[0][1] = 1;
for(int i = 0;i<m;i++)
{
for(int j = 0;j<n;j++) dp[i+1][j+1] = dp[i][j+1]+dp[i+1][j];//套用方程
}
return dp[m][n];
}
};
3. 63. 不同路径 II - 力扣(LeetCode)
//思路:动态规划。
//与上面那题的思路基本相同,区别在于多了障碍判断。有障碍的位置在dp中的值为0,代表走法数为0
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid)
{
int rows = obstacleGrid.size(),cols = obstacleGrid[0].size();
vector<vector<long long>> dp(rows+1,vector<long long>(cols+1));
dp[0][1] = 1;
for(int i = 0;i<rows;i++)
{
for(int j = 0;j<cols;j++)
{
//判断当前是否为障碍
if(!obstacleGrid[i][j])
dp[i+1][j+1] = dp[i+1][j]+dp[i][j+1];
}
}
return dp[rows][cols];
}
};