122. 买卖股票的最佳时机 II
该题用动态规划比较直观:
如果第i天持有股票即dp[i][0], 那么可以由两个状态推出来
- 第i-1天就持有股票,那么就保持现状,所得现金就是昨天持有股票的所得现金 即:dp[i - 1][0]
- 第i天买入股票,所得现金就是昨天不持有股票的所得现金减去 今天的股票价格 即:dp[i - 1][1] - prices[i]
如果第i天不持有股票即dp[i][1]的情况, 依然可以由两个状态推出来
- 第i-1天就不持有股票,那么就保持现状,所得现金就是昨天不持有股票的所得现金 即:dp[i - 1][1]
- 第i天卖出股票,所得现金就是按照今天股票价格卖出后所得现金即:prices[i] + dp[i - 1][0]
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n=prices.size();
int dp[n+1][2];
dp[0][0]=-prices[0]; //dp[x][0]:在x天持有股票的最大利润
dp[0][1]=0; //dp[x][1]:在x天没有股票的最大利润
for(int i=1;i<n;i++){
dp[i][0]=max(dp[i-1][1]-prices[i],dp[i-1][0]);
dp[i][1]=max(dp[i-1][0]+prices[i],dp[i-1][1]);
}
return max(dp[n-1][0],dp[n-1][1]);
}
};
55. 跳跃游戏
class Solution {
public:
bool canJump(vector<int>& nums) {
if(nums.size()==1) return true;
int cover = nums[0];
for(int i=0;i<=cover;i++){
cover=max(i+nums[i],cover);
if (cover>=nums.size()-1)
return true;
}
return false;
}
};
45. 跳跃游戏 II
首先计算下一次能跳到的区域的区间,然后对这个区间进行遍历,计算出下一个跳跃区间,每计算一次,增加一次跳跃次数,直到跳跃区间的右边界>=n-1时,停止循环。
class Solution {
public:
int jump(vector<int>& nums) {
int ans = 0;
int start = 0;
int end = 0;
while(end<nums.size()-1){
int maxpos = 0;
for(int i = start;i<=end;i++){
maxpos = max(maxpos,i+nums[i]);
}
start = end+1;
end = maxpos;
ans++;
}
return ans;
}
};