1005. K 次取反后最大化的数组和 - 力扣(LeetCode)

题目描述

给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个索引 i 并将 Ai 替换为 -Ai,然后总共重复这个过程 K 次。(我们可以多次选择同一个索引 i。)

以这种方式修改数组后,返回数组可能的最大和。

题目示例

输入:A = 4,2,3, K = 1

输出:5

解释:选择索引 (1,) ,然后 A 变为 4,-2,3。

解题思路

使用贪心算法,两次贪心策略解决该题,首先将数组按照绝对值从大到小排序,然后进行以下两次贪心策略。

  • 第一次贪心,我们取反,首先取反绝对值最大的负数,也就是最小值。如果第一次贪心正好消耗完 k,就不需要第二次贪心了。
  • 第二次贪心,如果我们按照第一次贪心之后,还有取反次数,我们再将数组的最后一个元素(因为第一次贪心完成后,如果还有取反次数,代表数组所有的负数已经全被取反,数组只剩正数,数组最后一个元素即为最小值)进行取反(如果 k 还剩奇数的话,因为偶数的话来回取反还是原来的值,所以就不用取反了)

最后将取反完成的数组取总和返回结果。

参考代码

java 复制代码
class Solution {
    public int largestSumAfterKNegations(int[] nums, int k) {

        // 将数组按照绝对值大小排序
        nums = IntStream.of(nums)
		     .boxed()
		     .sorted((o1, o2) -> Math.abs(o2) - Math.abs(o1))
		     .mapToInt(Integer::intValue).toArray();
        // 第一次贪心,将最大的负数取反
        for(int i = 0; i < nums.length; i++) {
            if(nums[i] < 0 && k > 0) {
                nums[i] *= -1;
                k--;
            }
        }
        // 第二次贪心,如果还有取反机会,将最小数字取反
        if(k % 2 == 1) {
            nums[nums.length - 1] *= -1;
        }
        // 取修改完数组的总和
        return Arrays.stream(nums).sum();
    }
}
相关推荐
凤凰院凶涛QAQ2 小时前
《Java版数据结构 & 集合类剖析》Map & Set & 反射:“从哈希碰撞到红黑树转换,反射帮你扒开 HashMap 的桶数组看个究竟”
java·数据结构·算法
H.莓飛2 小时前
【数据结构】排序_OJ题(一):计数、桶与排序后的处理
java·开发语言·数据结构
w_zero_one4 小时前
算法--模拟
java·数据结构·算法
秋天的怀念_David4 小时前
算法一千零一夜 · 第十三夜 幻方,武侠世界里的数学迷宫
java·程序人生·算法
秋天的怀念_David5 小时前
算法一千零一夜 · 第十四夜 幻方与奇妙的二进制
java·程序人生·算法
薛定e的猫咪5 小时前
(ICLR 2020)MAML 靠的不是快速学习,而是特征复用
人工智能·深度学习·学习·算法·机器学习
薛定e的猫咪5 小时前
(ICLR 2026)DF-META:面向 FJSP 的无导数元学习实例自适应调度
人工智能·深度学习·学习·算法·机器学习
java_nnnn7 小时前
LeetCode刷题滑动窗口(水果成篮+找到字符串中所有字母的异位词)Java
java·开发语言·leetcode
小羊没烦恼!7 小时前
异步编程:线程概述及使用
java·开发语言·mysql·算法·c#
wanderist.7 小时前
202609CSP认证P3
算法