[豪の算法奇妙冒险] 代码随想录算法训练营第二十八天 | 122-买卖股票的最佳时机Ⅱ、55-跳跃游戏、45-跳跃游戏Ⅱ、1005-K次取反后最大化的数组和
代码随想录算法训练营第二十八天 | 122-买卖股票的最佳时机Ⅱ、55-跳跃游戏、45-跳跃游戏Ⅱ、1005-K次取反后最大化的数组和
LeetCode122 买卖股票的最佳时机Ⅱ
题目链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/description/
文章讲解:https://programmercarl.com/0122.买卖股票的最佳时机II.html
视频讲解:https://www.bilibili.com/video/BV1ev4y1C7na/?vd_source=b989f2b109eb3b17e8178154a7de7a51
不能想太复杂,专注考虑今天和昨天,若股票价格有上涨,则有收益,否则无收益

class Solution {
public int maxProfit(int[] prices) {
if(prices.length == 1){
return 0;
}
int profit = 0;
for(int i = 1; i < prices.length; i++){
if(prices[i-1] < prices[i]){
profit += prices[i] - prices[i-1];
}
}
return profit;
}
}
LeetCode55 跳跃游戏
题目链接:https://leetcode.cn/problems/jump-game/description/
文章讲解:https://programmercarl.com/0055.跳跃游戏.html
视频讲解:https://www.bilibili.com/video/BV1VG4y1X7kB/?vd_source=b989f2b109eb3b17e8178154a7de7a51
跳几步无所谓,关键在于可跳的覆盖范围:每次取最大的跳跃步数,这个就是可以跳跃的覆盖范围,本题就转化为跳跃覆盖范围可不可以覆盖到终点
每次移动取最大跳跃步数(得到最大的覆盖范围),每移动一个单位,就更新最大覆盖范围

class Solution {
public boolean canJump(int[] nums) {
if(nums.length == 1){
return true;
}
int maxReach = 0;
for(int i = 0; i <= maxReach; i++){
maxReach = Math.max(maxReach, i+nums[i]);
if(maxReach >= nums.length-1){
return true;
}
}
return false;
}
}
LeetCode45 跳跃游戏Ⅱ
题目链接:https://leetcode.cn/problems/jump-game-ii/description/
文章讲解:https://programmercarl.com/0045.跳跃游戏II.html
视频讲解:https://www.bilibili.com/video/BV1Y24y1r7XZ/?vd_source=b989f2b109eb3b17e8178154a7de7a51
移动下标达到了当前覆盖的最远距离curMaxReach时,步数就要加一,同时将curMaxReach更新为在此区间中最远下一覆盖范围nextMaxReach,以此来增加覆盖距离。最后的步数就是最少步数

class Solution {
public int jump(int[] nums) {
if(nums == null || nums.length == 0 || nums.length == 1){
return 0;
}
int curMaxReach = 0;
int nextMaxReach = 0;
int cnt = 0;
for(int i = 0; i <= curMaxReach; i++){
nextMaxReach = Math.max(nextMaxReach, i+nums[i]);
if(nextMaxReach >= nums.length-1){
cnt++;
break;
}
if(i == curMaxReach){
curMaxReach = nextMaxReach;
cnt++;
}
}
return cnt;
}
}
LeetCode1005 K次取反后最大化的数组和
题目链接:https://leetcode.cn/problems/maximize-sum-of-array-after-k-negations/description/
文章讲解:https://programmercarl.com/1005.K次取反后最大化的数组和.html
视频讲解:https://www.bilibili.com/video/BV138411G7LY/?vd_source=b989f2b109eb3b17e8178154a7de7a51
最先想到的思路是,每次选取nums数组中最小的元素进行取反,k次后就能得到数组的最大和

class Solution {
public int findMinNum(int[] nums){
int minNum = nums[0];
int index = 0;
for(int i = 1; i < nums.length; i++){
if(minNum > nums[i]){
index = i;
minNum = nums[i];
}
}
return index;
}
public int largestSumAfterKNegations(int[] nums, int k) {
for(int i = 1; i <= k; i++){
int index = findMinNum(nums);
nums[index] = -nums[index];
}
int sum = 0;
for(int i = 0; i < nums.length; i++){
sum += nums[i];
}
return sum;
}
}

浙公网安备 33010602011771号