程式碼隨想錄演算法訓練營第28天 | 貪心進階

hailicy發表於2024-07-30

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();
    }
}

相關文章