【力扣-贪心】6、K次取反后最大化的数组和(1005)

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

题目描述

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

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

示例 1:

输入: A = [4,2,3], K = 1
输出: 5
解释: 选择索引 (1,) ,然后 A 变为 [4,-2,3]。
复制代码

示例 2:

输入: A = [3,-1,0,2], K = 3
输出: 6
解释: 选择索引 (1, 2, 2) ,然后 A 变为 [3,1,0,2]。
复制代码

示例 3:

输入: A = [2,-3,-1,5,-4], K = 2
输出: 13
解释: 选择索引 (1, 4) ,然后 A 变为 [2,3,-1,5,4]。
复制代码

解析

首先对数组进行排序,然后就可以取较小的值进行取反操作

  • 步骤
    • 对数组排序
    • 将负数全部取反
    • 判断k的值,如果k已经为0,就可以停止取反操作
    • 如果k>0,就再对数组排一次序
    • 对排序后的数组中的第一个元素进行取反操作,直到 k=0

代码

class Solution
{
public:
    int largestSumAfterKNegations(vector<int> &nums, int k)
    {
        sort(nums.begin(), nums.end());

        int sum = 0;
        // 求和
        for (auto num : nums)
        {
            sum += num;
        }
        return sum;
    }

    void selectIndex(vector<int> &nums)
    {
        // 判断元素是否是负数
        for (int i = 0; i < nums.size(); i++)
        {
            if (nums[i] <= 0 && k > 0)
            {
                nums[i] = -nums[i];
                k--;
            }
        }
        // 重新排序,现在的元素都是 >= 0 的
        sort(nums.begin(); nums.end());
        // 判断 k 是否大于0
        // 如果 k 还有剩余,只对第一个数字进行取反操作
        while (k > 0)
        {
            nums[0] = -nums[0];
            k--;
        }
    }
};
复制代码

猜你喜欢

转载自juejin.im/post/7035882974646108168