文章目录
- 使用最小花费爬楼梯
- 91解码方法
使用最小花费爬楼梯
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
if(cost.size() == 2)
return min(cost[0],cost[1]);
vector<int> dp;
dp.reserve(cost.size()+1);
dp[0] = 0;dp[1] = 0;
for(int i = 2;i <=cost.size();i++){
dp[i] = min(cost[i-2]+dp[i-2],cost[i-1]+dp[i-1]);
}
return dp[cost.size()];
}
};
空间复杂度可以优化为O(1);
可以试着倒着走,时间及空间复杂度不变;
91解码方法
题目
class Solution {
public:
int numDecodings(string s) {
//1.创建dp表
//2.初始化
//3.填表
//4.返回值
vector<int> dp(s.size());
dp[0] = s[0] != '0';//对于第一个字符,若不是0、则从在一个解,否则,不存在解
//处理边界
if(s.size() == 1) return dp[0];
if(s[0] != '0' && s[1] != '0') dp[1] += 1;
int t = (s[0] - '0') * 10 + s[1] - '0';// 前两个字符编码
if(t >= 10 && t <= 26) dp[1] += 1;
for(int i = 2; i < s.size(); i++){
if(s[i] != '0') dp[i] += dp[i-1];//处理单独编码
int t = (s[i-1] - '0') * 10 + s[i] - '0';
if(t >= 10 && t <= 26) dp[i] += dp[i-2];
}
return dp[s.size()-1];
}
};
优化:
class Solution {
public:
int numDecodings(string s) {
//优化
vector<int> dp(s.size()+1);
dp[0] = 1;//保证后面的填表具有正确性
dp[1] = s[1 - 1] != '0';
for(int i = 2; i <= s.size(); i++){
if(s[i - 1] != '0') dp[i] += dp[i-1];//处理单独编码
int t = (s[i - 2] - '0') * 10 + s[i - 1] - '0';
if(t >= 10 && t <= 26) dp[i] += dp[i-2];
}
return dp[s.size()];
}
};