赞
踩
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);
可以试着倒着走,时间及空间复杂度不变;
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()]; } };
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。