代码随想录算法训练营
Day28 代码随想录算法训练营第28 天 | LeetCode22.买卖股票的最佳时机II LeetCode55. 跳跃游戏 LeetCode45. 跳跃游戏 II LeetCode1005.K次取反后最大化的数组和
目录
前言
LeetCode22.买卖股票的最佳时机II
LeetCode55. 跳跃游戏
LeetCode45. 跳跃游戏 II
LeetCode1005.K次取反后最大化的数组和
一、LeetCode122.买卖股票的最佳时机II
1.题目链接
2.思路
(1)主思路:拆分利润
1)将购买方案拆成每天先买后卖,股票至多在手中存一天
2)购买方案拆分成相邻两天股价之差的和
3)想要和最大,选择所有最大的和即可
(2)举例
nums=[7,1,5,3,6,4]
股价差:0(第0天股价差不计入),-6,4,-2, 3,-2
选择4和3,也就是选择第1天买入,第2天卖出,第3天买入,第4天卖出这样的方案
3.题解
class Solution {
public:
int maxProfit(vector<int>& nums) {
int ans = 0;
for (int i = 1; i < nums.size(); i++) {
ans += max(0, nums[i] - nums[i - 1]);
}
return ans;
}
};
二、LeetCode 55. 跳跃游戏
1.题目链接
2.思路
(1)每个位置最远可以跳远的距离看作是覆盖范围,在这范围内向前移动
(2)每次移动的时候,都要更新覆盖范围
(3)如果覆盖范围大于等于整个数组,就说明能到最末端
3.题解
class Solution {
public:
bool canJump(vector<int>& nums) {
int len=nums[0];
for(int i=0;i<=len;i++)
{
len=max(len,nums[i]+i);
if(len>=nums.size()-1)return 1;
}
if(len<nums.size()-1)return 0;
else return 1;
}
};
三、LeetCode45.跳跃游戏II
1.题目链接
2.思路
(1)题目转化成:用最少的步数,让覆盖范围增加值终点
(2)步骤
1)记录两个量:这一步可以走的范围,下一步可以走的范围
2)如果这一步可以走的范围可以覆盖到终点,那么结束
3)在这一步可以走的范围内移动点,不断更新下一步可以走的范围
3)走到这一步可以走的范围边界,步数+1,这一步可以走的范围更新为下一步可以走的范围(进入下一步)
(3)注意
1)对于只有一个元素的数组,步数为0
2)其他情况,我默认初始状态是开始走第一步,所以步数初始化为1(第一步是明确要走的了)
3.题解
class Solution {
public:
int jump(vector<int>& nums) {
if (nums.size() == 1)
return 0;
int step = 1;
int cur = nums[0];
int next = nums[0];
for (int i = 0; i < nums.size(); i++) {
if (cur >= nums.size() - 1)
break;
next = max(next, i + nums[i]);
if (i == cur) {
cur = next;
step++;
}
}
return step;
}
};
四、LeetCode1005.K次取反后最大化的数组和
1.题目链接
2.思路
(1)优先对负数取反
(2)如果还有剩的,就把绝对值最小的正数反复取反
3.题解
class Solution {
public:
int largestSumAfterKNegations(vector<int>& nums, int k) {
sort(nums.begin(), nums.end());
int s = 0;
int i;
for (i = 0; i < k && i < nums.size(); i++) {
if (nums[i] > 0)
break;
nums[i] = nums[i] * (-1);
}
sort(nums.begin(), nums.end());
k -= i;
while (k > 0) {
nums[0] = nums[0] * (-1);
k -= 1;
}
for (int j = 0; j < nums.size(); j++) {
s += nums[j];
}
return s;
}
};