[豪の算法奇妙冒险] 代码随想录算法训练营第二十八天 | 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

​ 不能想太复杂,专注考虑今天和昨天,若股票价格有上涨,则有收益,否则无收益

image-20260113222506269

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

​ 跳几步无所谓,关键在于可跳的覆盖范围:每次取最大的跳跃步数,这个就是可以跳跃的覆盖范围,本题就转化为跳跃覆盖范围可不可以覆盖到终点

​ 每次移动取最大跳跃步数(得到最大的覆盖范围),每移动一个单位,就更新最大覆盖范围

image-20260114201008273

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,以此来增加覆盖距离。最后的步数就是最少步数

image-20260114202651045

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次后就能得到数组的最大和

image-20260114203826459

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;
    }
}
posted @ 2026-01-14 20:39  SchwarzShu  阅读(3)  评论(0)    收藏  举报