LeetCode-1005-K次取反后最大化的数组和-贪心算法

题目描述:

给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组:

选择某个下标 i 并将 numsi 替换为 -numsi

重复这个过程恰好 k 次。可以多次选择同一个下标 i 。

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

LeetCode-1005题目链接

思路见注释~
代码实现

java 复制代码
class Solution {
    /**
     * 先分情况:
     * ① 当数组中有正有负:优先将负数取反,负数中优先对找绝对值最大的进行取反;
     * ② 当数组中全是正数:如果还有机会则找绝对值最小的进行取反
     *
     *  步骤:
     *  ① 按绝对值从大到小进行排序
     *  ② 从前往后遍历数组,遇到负数就取反,当 k 还没用完,判断奇偶,是奇数则对最后一个元素取反,偶数不操作
     *  ③ 求数组的和再返回即可
     */
    public int largestSumAfterKNegations(int[] nums, int k) {
        if (nums.length == 1){
            if (k%2==0){//偶数,等于本身
                return nums[0];
            }else {
                return -nums[0];// 奇数,会变成相反数
            }
        }
        int sum = 0;
        // 对数组进行排序是重点,这个地方我掌握的并不熟
        nums = IntStream.of(nums)
                        .boxed()
                                .sorted((o1,o2) -> Math.abs(o2) - Math.abs(o1))
                                        .mapToInt(Integer::intValue).toArray();
//        Arrays.sort((x,y)->Math.abs(y) - Math.abs(x));
//        Arrays.asList(nums).stream().sorted((x,y)->Math.abs(y) - Math.abs(x)).toArray();
        // 第一次遍历取反
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] <0 && k>0){
                nums[i] *= -1;
                k--;
            }
        }
        if (k > 0){
            if (k % 2==1){
                nums[nums.length-1] *= -1;// 取反
            }
        }
        // 第一种求和方法:第二次遍历求和
//        for (int i = 0; i < nums.length; i++) {
//            sum += nums[i];
//        }
        return Arrays.stream(nums).sum();//第二种求和方法
    }
}
相关推荐
旖旎夜光3 分钟前
LeetCode 904:水果成篮(滑动窗口) —— 题解
数据结构·c++·算法·leetcode·滑动窗口
ZC跨境爬虫37 分钟前
LeetCode 27. 移除元素(双指针详解 + Java Python 多解法对比)
java·python·leetcode
我变成萤火虫2 小时前
河南萌新联赛2026第(三)场:郑州轻工业大学
数据结构·c++·算法·贪心算法·stl·深度优先·哈希算法
LuminousCPP3 小时前
单链表专题(四)-刷题复盘篇-LeetCode 138 随机链表复制|原地拷贝法突破复杂指针操作
数据结构·笔记·算法·leetcode·链表
chuan.bai4 小时前
Java RAG 实战(第 8 篇):Spring Boot RAG 查询 API
java·spring boot·贪心算法
Forever Nore4 小时前
LeetCode 14 最长公共前缀 - 纵向扫描
linux·服务器·leetcode
圣保罗的大教堂4 小时前
leetcode 3090. 每个字符最多出现两次的最长子字符串 简单
leetcode
瑞码空间4 小时前
贪心算法详情分析
贪心算法·算法设计·算法分析
旖旎夜光17 小时前
LeetCode 3:无重复字符的最长子串(滑动窗口) —— 题解
数据结构·c++·算法·leetcode·滑动窗口
Navigator_Z20 小时前
LeetCode //C - 1192. Critical Connections in a Network
c语言·算法·leetcode