122.买卖股票的最佳时机 II
贪心策略是收集每一天正的利润值。
class Solution {
public:
int maxProfit(vector<int>& prices) {
int result = 0;
for (int i = 1; i < prices.size(); ++i) {
result += max(0, prices[i] - prices[i - 1]);
}
return result;
}
};
55. 跳跃游戏
重要的不是怎么跳跃,而是覆盖范围。
那么怎么跟踪覆盖范围呢?通过遍历覆盖范围内的元素,及时更新新的覆盖范围,当覆盖范围超过最后一个下标,返回true。
class Solution {
public:
bool canJump(vector<int>& nums) {
int cover = 0;
if (nums.size() == 1)
return true;
for (int i = 0; i <= cover; ++i) {
cover = max(cover, nums[i] + i);
if (cover >= nums.size() - 1)
return true;
}
return false;
}
};
45.跳跃游戏 II
初始覆盖范围是0,数组第一个元素。遍历覆盖元素,并且记录下一个覆盖范围的最大值,当遍历完覆盖范围,且没有到达终点,计数+1,更新覆盖范围。
class Solution {
public:
int jump(vector<int>& nums) {
int cur = 0, next = 0;
int result = 0;
for (int i = 0; i < nums.size(); ++i) {
next = max(next, i + nums[i]);
if (i == cur) {
if (i != nums.size() - 1) {
result++;
cur = next;
if (cur >= nums.size() - 1)
break;
}
}
}
return result;
}
};
1005.K次取反后最大化的数组和
我原本的想法是循环k次,每次都对数组排序,将最小的元素取反。这个策略效率太低。
贪心策略是先按绝对值排序,然后先把负数取反;然后根据剩余的翻转次数,对最小的数进行取反。
通过更小的颗粒度处理,提高了效率。
class Solution {
static bool compare(int a, int b) {
return abs(a) > abs(b);
}
public:
int largestSumAfterKNegations(vector<int>& nums, int k) {
sort(nums.begin(), nums.end(), compare);
for (int i = 0; i < nums.size(); ++i) {
if (nums[i] < 0 && k > 0) {
k--;
nums[i] *= -1;
}
}
if (k % 2)
nums[nums.size() - 1] *= -1;
int result = accumulate(nums.begin(), nums.end(), 0);
return result;
}
};