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

贪心

解题思路

  1. 局部最优:让绝对值大的负数变为正数,当前数值达到最大;

  2. 整体最优:整个数组和达到最大;

  3. 贪心思路:

    • 先将 nums [2, -3, -1, 5, -4] 进行 绝对值降序排序 后,会变成 [5, -4, -3, 2, -1] 则可以从 最小负数 开始反转,这样求和会更大;
    • 迭代 nums 数组并开始对 负数 开始反转 k--
    • 如果负数全部反转完成后 k 还是大于 0 ,则需要对最小的数字不断反转剩下的次数即可;前面的 绝对值降序排序 会将最小值放到最后,直接对最小值反转剩下的次数;
    • 返回数组的求和结果;

复杂度

  1. 时间复杂度: O(nlogn),其中 n 为数组长度,排序花费了 O(nlogn)

  2. 空间复杂度: O(1)

代码实现

var largestSumAfterKNegations = function (nums, k) {
    // 1. 绝对值降序排序 => 最小的负数在最前面
    nums.sort((a, b) => Math.abs(b) - Math.abs(a));

    for (let i = 0; i < nums.length; i++) {
        // 2. 对负数进行取反
        if (nums[i] < 0 && k > 0) {
            nums[i] = - nums[i];
            k--;
        }
    }

    // 3. 若 k 还大于 0,则寻找最小的数进行不断取反
    while (k--) nums[nums.length - 1] = - nums[nums.length - 1];

    return nums.reduce((a, b) => a + b, 0);
};
打赏作者
您的打赏是我前进的动力
微信
支付宝
评论

中午好👏🏻,我是 ✍🏻   疯狂 codding 中...

粽子

这有关于前端开发的技术文档和你分享。

相信你可以在这里找到对你有用的知识和教程。

了解更多

目录

  1. 1. 贪心
    1. 1.1. 解题思路
    2. 1.2. 复杂度
    3. 1.3. 代码实现