代码随想录算法训练营Day28

买卖股票的最佳时机

每天的利润组成一个数组,取数组中的正数(局部最优),加起来就是总的最大的利润

class Solution {  
    public int maxProfit(int[] prices) {  
        int[] profit = new int[prices.length-1];  
        int j = 0;  
        int result = 0;  
        for(int i = 1;i<prices.length;i++){  
            result += Math.max(prices[i] - prices[i-1],0);  
        }  
        return result;  
    }  
}

跳跃游戏

class Solution {  
    public boolean canJump(int[] nums) {  
        if(nums.length==1){  
            return true;  
        }  
        int cover = 0;  
        for(int i = 0;i<=cover;i++){  
            cover = Math.max(cover,i+nums[i]);  
            if(i+nums[i]>=nums.length-1){  
                return true;  
            }  
        }  
        return false;  
    }  
}

跳跃游戏2

局部最优:当前可移动距离尽可能多走,如果还没到终点,步数再加一。整体最优:一步尽可能多走,从而达到最少步数。
要从覆盖范围出发,以最小的步数增加覆盖范围,覆盖范围一旦覆盖了终点,得到的就是最少步数!
每次跳之前看最远能跳到哪,然后遍历你这个能跳的范围里的所有点,找到一个能跳的离终点更近的点跳过去。

class Solution {  
    public int jump(int[] nums) {  
        if (nums == null || nums.length == 0 || nums.length == 1) {  
            return 0;  
        }  
        int count = 0;  
        int curcover = 0;//当前覆盖范围  
        int nextcover = 0;//下一步覆盖范围  
        for (int i = 0; i < nums.length; i++) {  
            nextcover = Math.max(nextcover, i + nums[i]);  
            if (i == curcover && curcover < nums.length - 1) {  
                count++;  
                curcover = nextcover;  
            }  
            if (curcover >= nums.length - 1) {  
                break;  
            }  
        }  
        return count;  
    }  
}

K次取反后最大的数组和

按绝对值从大到小排序数组

class Solution {  
    public int largestSumAfterKNegations(int[] nums, int k) {  
        int result = 0;  
        nums = IntStream.of(nums)  
                .boxed()  
                .sorted((o1, o2) -> Math.abs(o2) - Math.abs(o1))  
                .mapToInt(Integer::intValue).toArray();  
        for (int i = 0; i < nums.length; i++) {  
            if (nums[i] < 0 && k > 0) {  
                nums[i] = -nums[i];  
                k--;  
            } //全是正数了,那么最小的正数即为最右边的数  
        }  
        if (k % 2 == 1) {  
            nums[nums.length - 1] *= -1;  
        } //如果是偶数,乘和不乘一样  
        for (int i = 0; i < nums.length; i++) {  
            result += nums[i];  
        }  
        return result;  
    }  
}
posted @ 2025-04-23 22:01  Anson_502  阅读(7)  评论(0)    收藏  举报