代码随想录算法训练营第28天 | 贪心进阶

2024年7月30日

题122. 买卖股票的最佳时机 II
上涨就买,下跌就不买。

class Solution {
    public int maxProfit(int[] prices) {
        int sum = 0;
        for(int i=1;i<prices.length;i++){
            sum+=prices[i]-prices[i-1]>0?prices[i]-prices[i-1]:0;
        }
        return sum;
    }
}

题1005. K 次取反后最大化的数组和
首先看有多少负数,如果大于等于K,就将K个最小的负数翻转,否则翻转所有负数。然后再来考虑K,如果数组包含0,就直接返回,如果不包含,就再看剩余翻转次数是不是偶数,如果是偶数也直接返回,否则将此时最小的正数翻转。

class Solution {
    public int largestSumAfterKNegations(int[] nums, int k) {
        //将数组排序
        //最前面的就是最大的负数,优先翻转
        Arrays.sort(nums);
        //有多少负数
        int negaNum=0;
        for(int i=0;i<nums.length;i++){
            if(nums[i]<0){
                negaNum+=1;
            }else{
                break;
            }
        }
        if(k<=negaNum){
            for(int i=0;i<k;i++){
                nums[i] = -nums[i];
            }
        }else{
            for(int i=0;i<negaNum;i++){
                nums[i] = -nums[i];
            }
            Arrays.sort(nums);
            //看有没有0
            for(int i:nums){
                if(i==0){
                    return Arrays.stream(nums).sum();
                }
            }
            //没有0就取最小的正数
            k-=negaNum;
            if(k%2==0){
                return Arrays.stream(nums).sum();
            }else{
                nums[0] = -nums[0];
            }
        }
        return Arrays.stream(nums).sum();
    }
}
posted @ 2024-07-30 11:51  hailicy  阅读(5)  评论(0编辑  收藏  举报