算法训练营第三十六天 | LeetCode 1005 K次取反后最大化的数组、LeetCode 134 加油站

算法训练营第三十六天 | LeetCode 1005 K次取反后最大化的数组、LeetCode 134 加油站

码农世界 2024-05-22 后端 66 次浏览 0个评论

LeetCode 1005 K次组饭后最大化的数组

这题贪的主要是数值最大化。如果K > 负数个数,我们就先将负数全部转换成它的相反数,并将K--,之后K剩余的值可以对2取模,为0的话直接得出最后结果,为的话我们要在当前所有值里取最小值,对其进行取反。如果K <= 负数个数,K用完直接结束,将数组累加即可。

代码如下:

class Solution {
    public int largestSumAfterKNegations(int[] nums, int k) {
        Arrays.sort(nums);
        int sum = 0;
        for (int i = 0; i < nums.length; i++) {
            if (k == 0) break;
            if (nums[i] < 0) {
                k--;
                nums[i] *= -1;
            } else break;
        }
        if (k > 0 && k % 2 == 1) {
            Arrays.sort(nums);
            nums[0] *= -1;
        }
        for (int i = 0; i < nums.length; i++) {
            sum += nums[i];
        }
        return sum;
    }
}

LeetCode 134 加油站

参考题解,仍需改进

class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
        int n = gas.length;
        int i = 0;
        while (i < n) {
            int sumOfGas = 0, sumOfCost = 0;
            int cnt = 0;
            while (cnt < n) {
                int j = (i + cnt) % n;
                sumOfGas += gas[j];
                sumOfCost += cost[j];
                if (sumOfCost > sumOfGas) {
                    break;
                }
                cnt++;
            }
            if (cnt == n) {
                return i;
            } else {
                i = i + cnt + 1;
            }
        }
        return -1;
    }
}

LeetCode 135 分发糖果

明天有时间再改改,今天没力气了

转载请注明来自码农世界,本文标题:《算法训练营第三十六天 | LeetCode 1005 K次取反后最大化的数组、LeetCode 134 加油站》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,66人围观)参与讨论

还没有评论,来说两句吧...

Top