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

文章目录

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

题目描述

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

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

重复这个过程恰好 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 <= numsi <= 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. 计算数组和:最后,计算并返回数组的总和。
相关推荐
richard_yuu17 分钟前
JSON vs XML vs 二进制:3种序列化终极选型
xml·c++·qt·学习·json
没落之王30 分钟前
易学使者郑氏正脉郑冰推演马航事件
大数据·人工智能·算法·机器学习·可用性测试
阿部多瑞 ABU1 小时前
告别手工核图:基于 .NET + MuPDFCore 的 CAD 等轴测 PDF 材料表提取与新旧版本对比实战
后端·算法·ui·pdf·c#
郝学胜-神的一滴1 小时前
并查集深度入门:从玄学抽象到 QuickFind & QuickUnion 源码实战
数据结构·c++·python·程序人生·算法·软件开发
比奇堡裤头村1 小时前
统计学习方法——决策树
算法·决策树·学习方法
灵晔君1 小时前
【Linux】进程控制(一)——进程创建、进程终止与进程等待
linux·c语言·算法
ShineWinsu9 小时前
对于C++:IO流状态的详细解析
c++·面试·io·cin·io流状态·goodbit·failbit
数模竞赛Paid answer10 小时前
2026年中青杯数学建模A题数学建模论文智能评估系统与多智能体优化方法求解全过程论文及程序
算法·数学建模·中青杯
银-豆豆10 小时前
数据结构与算法-动态规划、回溯与贪心
算法·动态规划
Lzg_na11 小时前
constexpr的优势
c++