力扣打卡:1005. K 次取反后最大化的数组和
解题思路
越是简单的题目就越容易在细节问题上卡死
思路
- 如果操作数
k
小于nums.length
,那么在数组排序后,更改前k
个小值就可 - 如果操作数
k
大于nums.length
,那么说明了数组所有的负数都会被更改,而整数不进行操作 - 最后检查k的次数
- 如果是偶数,那么对最小值(非负数)转变偶数次,还是原来的值
- 如果是奇数,那么对最小值(非负数)转变奇数次,变为相反数
Step
- 现将数组排序,使用数组的
api
,时间复杂度为 O( n * log n) - 对数组进行索引,在数组索引
idx
范围内,并且在操作数k
还有剩余时,将负数转为相反数 - 结束循环条件,对数组重新排序,并进行求和
sum
- 如果操作数
k
已经为0
,那么直接返回数组和 sum
结果即可 - 如果操作数
k
不为0
- 如果操作数还剩偶数,直接返回
数组和sum
- 如果操作数还剩奇数,返回
sum = sum-nums[0]-nums[0]
,减两次,理解求和过程
- 如果操作数还剩偶数,直接返回
- 结束
代码
class Solution {
public int largestSumAfterKNegations(int[] nums, int k) {
Arrays.sort(nums);
int idx = 0;
while(idx < nums.length && nums[idx]<0 && k>0){ // 将所有小于0的数进行求转
nums[idx] = -nums[idx++];
k--;
}
Arrays.sort(nums);
int sum = 0;
for(int x: nums) sum += x;
if(k==0) return sum; //此时的idx等于k,那么也就是说明了,此时的k次变化已经成功,直接return就可
// 此时的idx不等于k
if(k%2==0) return sum;
sum -= nums[0];
sum -= nums[0];
return sum;
}
}