122. 买卖股票的最佳时机 II
思路
- 贪心
本题的意思是同一天只能持有一支股票或者不持有,而且可以当天买了再卖,所以只要第二天的价格比第一天高就可以卖,同时卖完还可以买 - DP
代码
- 贪心
class Solution {
public:
int maxProfit(vector<int>& prices) {
int res = 0;
for (int i = 1; i < prices.size(); i ++){
if (prices[i] > prices[i - 1]) res += prices[i] - prices[i - 1];
}
return res;
}
};
- DP
class Solution {
public:
int maxProfit(vector<int>& prices) {
vector<vector<int>> f(prices.size(), vector<int> (2,0));
// f[i][0]不持有 最大利润
// f[i][1]持有 最大利润
f[0][1] -= prices[0];
for(int i = 1; i < prices.size(); i ++){
f[i][0] = max(f[i - 1][0], f[i - 1][1] + prices[i]);
f[i][1] = max(f[i - 1][1], f[i - 1][0] - prices[i]);
}
return max(f[prices.size() - 1][0], f[prices.size() - 1][1]);
}
};
55. 跳跃游戏
思路
看格子的长度是否能到达最后一格子,每次都循环此格能到的最远的地方,类似剪枝吧
代码
class Solution {
public:
bool canJump(vector<int>& nums) {
int l = 0;
if (nums.size() == 1) return true;
for (int i = 0; i <= l; i ++){
l = max(l, i + nums[i]);
if (l >= nums.size() - 1) return true;
}
return false;
}
};
45. 跳跃游戏 II
思路
- DP
f[i]
是跳到该位置的最小次数,所以每一层都要遍历从0~i-1
算最小次数 - 贪心
看第一步能跳到哪个区间,然后遍历看下一步最远的地方,如果说这一步还没到终点,就需要增加一步,继续这个循环
代码
- dp
class Solution {
public:
int jump(vector<int>& nums) {
vector<int> f(nums.size(), INT_MAX); // 跳到该位置的最小跳越数
f[0] = 0;
for (int i = 1; i < nums.size(); i ++){
for(int j = 0; j < i; j ++){
if (j + nums[j] >= i && f[j] < INT_MAX) {
f[i] = min(f[j] + 1, f[i]);
// cout << f[i] << endl;
}
}
}
return f[nums.size() - 1];
}
};
- 贪心
class Solution {
public:
int jump(vector<int>& nums) {
int cur = 0;
int next = 0;
int res = 0;
for (int i = 0; i < nums.size() - 1; i ++){
next = max(i + nums[i], next);
if (i == cur){
res ++;
cur = next;
}
}
return res;
}
};