Day 32
122 买卖股票的最佳时机II
贪心策略:把这些分成每一天,把所有盈利的天数的值加起来。
class Solution {
public:
int maxProfit(vector<int>& prices) {
int result=0;
for(int i=0;i<prices.size()-1;i++){
result+=max((prices[i+1]-prices[i]),0);
}
return result;
}
};
55. 跳跃游戏
贪心策略:不需要考虑路径,而是考虑可覆盖范围。
class Solution {
public:
bool canJump(vector<int>& nums) {
int cover=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
贪心策略:本质还是cover范围,当到达当前覆盖最大范围的时候更新下一步最大范围并将步数+1.
class Solution {
public:
int jump(vector<int>& nums) {
if(nums.size()==1) return 0;
int curcover=0;
int ans=0;
int nextcover=0;
for(int i=0;i<nums.size();i++){
nextcover=max((nums[i]+i),nextcover);
if(i==curcover){
ans++;
curcover=nextcover;
if(curcover>=nums.size()-1) break;
}
}
return ans;
}
};
1005.K次取反后最大化的数组和
看到这个题目想法很简单:每次最小的数取反。但是实现起来没有想到通过绝对值排序,然后最后剩的k次在最小的那个数上反复取反。
class Solution {
static bool cmp(int a, int b) {
return abs(a) > abs(b);
}
public:
int largestSumAfterKNegations(vector<int>& nums, int k) {
sort(nums.begin(),nums.end(),cmp);
for(int i=0;i<nums.size();i++){
if(nums[i]<0&&k>0){
nums[i]*=-1;
k--;
}
}
if(k%2==1) nums[nums.size()-1]*=-1;
int result=0;
for(int a:nums) result+=a;
return result;
}
};