今天是第29天刷leetcode,立个flag,打卡60天。
算法挑战链接
1005. K 次取反后最大化的数组和https://leetcode.cn/problems/maximize-sum-of-array-after-k-negations/
第一想法
题目理解:数组在进行K次取反后,求累加的最大值。
取反操作可重复用于同一个数字。
思路也是比较容易理解:先将数组进行排序,尽可能的将数组中的负数都转化成正数。如果数组都是被转化成正数后,且还需x次取反,如果x是偶数,则不需要操作,如果x是奇数,将全部正数的数组再次排序后,将第一个转换成负数。在计算数组的累加和即可。
代码如下:
class Solution {
public int largestSumAfterKNegations(int[] nums, int k) {
//第一次先排序
Arrays.sort(nums);
int temp = 0;
for (int i = 0; i < k; i++) {
int index = i % nums.length;
if (nums[index]>=0) {
//第二次排序
Arrays.sort(nums);
break;
}
temp++;
nums[index] *= -1;
}
if ((k - temp)%2 == 1) {
nums[0]*=-1;
}
int result = 0;
for (int i = 0; i < nums.length; i++) {
result+=nums[i];
}
return result;
}
}
看完代码随想录之后的想法
贪心算法的解题过程会更加的清晰易懂
本题的解题步骤为:
- 第一步:将数组按照绝对值大小从大到小排序,注意要按照绝对值的大小
- 第二步:从前向后遍历,遇到负数将其变为正数,同时K--
- 第三步:如果K还大于0,那么反复转变数值最小的元素,将K用完
- 第四步:求和
代码如下:
class Solution {
public int largestSumAfterKNegations(int[] nums, int K) {
// 将数组按照绝对值大小从大到小排序,注意要按照绝对值的大小
nums = IntStream.of(nums)
.boxed()
.sorted((o1, o2) -> Math.abs(o2) - Math.abs(o1))
.mapToInt(Integer::intValue).toArray();
int len = nums.length;
for (int i = 0; i < len; i++) {
//从前向后遍历,遇到负数将其变为正数,同时K--
if (nums[i] < 0 && K > 0) {
nums[i] = -nums[i];
K--;
}
}
// 如果K还大于0,那么反复转变数值最小的元素,将K用完
if (K % 2 == 1) nums[len - 1] = -nums[len - 1];
return Arrays.stream(nums).sum();
}
}