88)爬楼梯的最少成本
first=cost[0], second=cost[1];
class Solution{
public:
int minCostClimbingStairs(vector<int>& cost){
int n = cost.size();
int first = cost[0];
int second = cost[1];
for(int i=2; i<cost.size(); i++){
int next = min(first, second)+cost[i];
first = second;
second = next;
}
return min(first, second);
}
};
first=second=0;
class Solution{
public:
int minCostClimbingStairs(vector<int>& cost){
int n = cost.size();
int first = 0, second = 0;
for(int i=2; i<=n; i++){
int next = min(first+cost[i-2], second+cost[i-1]);
first = second;
second = next;
}
return second;
}
};
89)打家劫舍(房屋偷盗)
用动态数组来维护
class Solution{
public:
int rob(vector<int>& nums){
int N=nums.size();
vector<int> dp(N+1);
dp[0] = 0;
dp[1] = nums[0];
for(int i=2; i<=nums.size(); i++){
dp[i] = max(dp[i-1], dp[i-2]+nums[i-1]);
}
return dp[N];
}
};
无额外空间
class Solution{
public:
int rob(vector<int>& nums){
int first=0, second=0;
for(int num : nums){
int temp = max(first+num, second);
first = second;
second = temp;
}
return second;
}
};
90)环形房屋偷盗
class Solution{
public:
int rob(vector<int>& nums){
int n = nums.size();
if(n==1) return nums[0];
vector<int> f(n+1), g(n+1);
f[1] = nums[0];
g[2] = nums[1];
for(int i=2; i<n; i++) f[i] = max(f[i-1], f[i-2]+nums[i-1]);
for(int i=3; i<=n; i++) g[i] = max(g[i-1], g[i-2]+nums[i-1]);
return max(f[n-1], g[n]);
}
};