贪心day2

1005. K 次取反后最大化的数组和

class Solution {
    public int largestSumAfterKNegations(int[] nums, int k) {
        Arrays.sort(nums);
        int res = 0;
        //反转负数 计算总和
        int i = 0, min = 0;
        for (; i < nums.length; i++) {
            //贪心:如果是负数,k还有盈余,把k反过来
            if (nums[i] < 0 && k > 0) {
                nums[i] = -nums[i];
                k--;
            }
            res += nums[i];
            //存最小非负数
            if (i != 0) {
                min = Math.min(nums[i], min);
            } else {
                min = nums[i];
            }
        }
        //处理负数处理完k还有奇数盈余的情况 减掉2倍最小正数 因为前面加上了该正数
        return res - (k % 2 == 1 ? 2 * min : 0);
    }
}

 

参考官解精选评论1:https://leetcode-cn.com/problems/maximize-sum-of-array-after-k-negations/solution/k-ci-qu-fan-hou-zui-da-hua-de-shu-zu-he-4r5lb/

 

class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
        int len = gas.length, sum = 0, start = 0, curSum = 0;
        //int[] rest = new int[len];
        for (int i = 0; i < len; i++) {
            //rest[i] = gas[i] - cost[i];
            int rest = gas[i] - cost[i];
            sum += rest;
            curSum += rest;
            //如果curSum小于0,那么得到curSum的这一段区间不能作为起点
            if (curSum < 0) {
                curSum = 0;
                start = i + 1;
            }
        }
        //oversubscribed return
        if (sum < 0) return -1;
        return start;
    }
}

参考:https://programmercarl.com/

posted @ 2022-04-30 21:30  一梦两三年13  阅读(22)  评论(0)    收藏  举报