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

力扣打卡: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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值