122. 买卖股票的最佳时机 II
总收益可拆解为相邻单日正收益之和,局部最优(赚单日差价)能直接推导出全局最优
cpp
int maxProfit(vector<int>& prices) {
int res = 0;
for(int i = 1; i < prices.size(); i++){
if(prices[i] - prices[i - 1] > 0){
res += prices[i] - prices[i - 1];
}
}
return res;
}
55. 跳跃游戏
每一步的贪心选择:扩展最远边界
cpp
bool canJump(vector<int>& nums) {
int farest = 0;
for(int i = 0; i < nums.size() && i <= farest; i++){
farest = max(i + nums[i], farest);
if(farest >= nums.size() - 1){
return true;
}
}
return false;
}
45. 跳跃游戏 II
分层跳跃求最少次数
每次在最远边界之前 都记录 下次更新的值
到达边界后 跳一步 再更新边界,若边界未到达终点,则需要进入下一跳边界的寻找中
cpp
int jump(vector<int>& nums) {
if(nums.size() == 1){
return 0;
}
int farest = 0;
int end = 0;
int res = 0;
for(int i = 0; i < nums.size() - 1; i++){
farest = max(i + nums[i], farest);
if(i == end){
end = farest;
res++;
}
}
return res;
}
1005. K 次取反后最大化的数组和
第一步:排序
第二步:尽可能将所有负数取反
第三步:若k没用完,此时nums中所有数都大于等于0,取负两次相当于没变化,于是用k%2,若还余1,把最小的数取反
第四步:求和
cpp
int largestSumAfterKNegations(vector<int>& nums, int k) {
sort(nums.begin(), nums.end());
//对所有负数取反
for(int i = 0; i < nums.size() && k > 0; i++){
if(nums[i] < 0){
nums[i] = nums[i] * -1;
k--;
}
else{
break;
}
}
//若k有剩余,对最小的数取反
if(k > 0){
if(k % 2 == 1){
sort(nums.begin(), nums.end());
nums[0] = nums[0] * -1;
}
}
//求和
int sum = 0;
for (int num : nums) {
sum += num;
}
return sum;
}