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

文章目录

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

题目描述

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

选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。

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

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

示例 1:

输入:nums = [4,2,3], k = 1

输出:5

解释:选择下标 1 ,nums 变为 [4,-2,3] 。

示例 2:

输入:nums = [3,-1,0,2], k = 3

输出:6

解释:选择下标 (1, 2, 2) ,nums 变为 [3,1,0,2] 。

示例 3:

输入:nums = [2,-3,-1,5,-4], k = 2

输出:13

解释:选择下标 (1, 4) ,nums 变为 [2,3,-1,5,4] 。

提示:

  • 1 <= nums.length <= 104
  • -100 <= nums[i] <= 100
  • 1 <= k <= 104

暴力

这段代码实现了一个特定算法,旨在通过最多K次将数组中的元素取反操作,得到修改后数组可能的最大和。下面是对这段代码的详细注释:

cpp 复制代码
class Solution {
public:
    int largestSumAfterKNegations(vector<int>& nums, int k) {
        // 首先,对数组进行排序,目的是将负数置于数组前部,方便后续处理。
        sort(nums.begin(),nums.end());

        int sum = 0; // 初始化数组和为0。
        
        // 遍历数组,优先对负数进行取反操作。
        for(int i = 0; i < nums.size(); i++)
        {
            // 如果当前数字为负数且还有取反的机会(k>0),则将其取反。
            if(nums[i] < 0 && k > 0)
            {
                nums[i] = -nums[i]; // 取反操作
                k--; // 消耗一次取反的机会
            }
        }

        // 再次对数组进行排序,目的是处理完所有负数取反后,重新排列。
        sort(nums.begin(), nums.end());

        // 再次遍历数组,这次主要处理剩余的取反机会。
        for(int i = 0; i < nums.size(); i++)
        {
            // 如果当前元素非负,且还有取反机会
            if(nums[i] >= 0 && k > 0)
            {
                // 如果k为偶数,则无需再进行取反操作,因为偶数次取反相互抵消。
                if(k % 2 == 0)
                    k -= 2; // 直接减去2,表示偶数次取反操作不影响结果。
                else
                {
                    // 如果k为奇数,则需要对当前最小的非负数进行一次取反,保证结果是最大的。
                    nums[i] = -nums[i];
                    k--; // 消耗一次取反机会
                }
            }
            // 计算当前序列的和
            sum += nums[i];
        }
        // 返回最终的数组和
        return sum;
    }
};

算法逻辑概述:

  1. 排序:先对数组进行一次排序,将负数放在数组的前面。
  2. 负数取反 :遍历数组,对负数进行取反操作,直到没有取反机会(k用尽)或没有负数为止。
  3. 再次排序:对处理后的数组再次进行排序,这样最小的非负数(可能之前是负数)会排在数组的最前面。
  4. 处理剩余的取反机会 :再次遍历数组,如果还有取反的机会,优先对最小的非负数进行取反(因为如果k为奇数,只能对一个数取反,为了最大化数组和,应该对最小的数取反)。
  5. 计算数组和:最后,计算并返回数组的总和。
相关推荐
爱理财的程序媛3 小时前
openclaw 盯盘实践
算法
端平入洛4 小时前
auto有时不auto
c++
MobotStone7 小时前
Google发布Nano Banana 2:更快更便宜,图片生成能力全面升级
算法
颜酱10 小时前
队列练习系列:从基础到进阶的完整实现
javascript·后端·算法
用户57573033462410 小时前
两数之和:从 JSON 对象到 Map,大厂面试官到底在考察什么?
算法
程序猿追10 小时前
“马”上行动:手把手教你基于灵珠平台打造春节“全能数字管家”
算法
ZPC82101 天前
docker 镜像备份
人工智能·算法·fpga开发·机器人
ZPC82101 天前
docker 使用GUI ROS2
人工智能·算法·fpga开发·机器人
琢磨先生David1 天前
Day1:基础入门·两数之和(LeetCode 1)
数据结构·算法·leetcode
哇哈哈20211 天前
信号量和信号
linux·c++