作者:飘泊的牛小盆友 | 来源:互联网 | 2023-10-11 14:29
题目链接:https://leetcode-cn.com/problems/maximize-sum-of-array-after-k-negations/
给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组:
选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。重复这个过程恰好 k 次。可以多次选择同一个下标 i 。
以这种方式修改数组后,返回数组 可能的最大和 。
示例 1:
输入:nums = [4,2,3], k = 1 输出:5 解释:选择下标 1 ,nums 变为 [4,-2,3] 。
提示:
1 <= nums.length <= 104
-100 <= nums[i] <= 100
1 <= k <= 104
题目分析: 给我们一个整数数组nums和一个整数K,数组经历K次修改(对数组中某一个元素取相反数即为一次修改),能够得到的数组最大和。既然是要「数组和最大」,同时修改又是取相反数。那么我们尽可能的将所有修改都用于数组中的「非正数」,是不是得到的和就会尽可能的大。但是可能出现的数组中「非正数」的个数小于K,或者说数组中根本没有「非正数」,那么这个时候我们只需要将最小的正数进行反复修改,这样对结果的影响是最小的。此时可能出现两种情况:- 如果这个时候K为奇数,那么最终的结果就是:整个数组的和sum-(2*最小正数),因为本来数组和是加上了最小正数,但是现在应该减去它,所以要减去2倍的最小正数。
- 如果这个时候K为偶数,那么当前数组和就是最终的结果,因为经过偶数次修改,相当于没修改。
代码如下:
public int largestSumAfterKNegations(int[] nums, int k) {
//先排序
Arrays.sort(nums);
//非正数进行修改
for (int i = 0; i 0; i++) {
if (nums[i] <= 0) {
nums[i] = -nums[i];
k--;
} else {
break;
}
}
//数组求和
int sum = 0;
for (int i = 0; i sum += nums[i];
}
if (k > 0) {
//此时再次将数组进行排序,得到的数组都是正数,最小值就是nums[0]
Arrays.sort(nums);
return k % 2 == 0 ? sum : sum - (2 * nums[0]);
} else {
return sum;
}
}
由于对数组进行了排序
时间复杂度O(nlogn)
空间复杂度O(n)