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

思路

没想到怎么做就看题解了呜呜呜呜,怎么一点思路都没呢!

贪心+分情况模拟

简单来说,就是要想反转后和最大,那肯定优先去反转负数,但如果反转完负数K的次数还有,那就分情况

  1. k为奇数,重复反转最小的值【题目允许】
  2. k为偶数,无需操作还是原来的结果。

PS:这里按绝对值从大到小排序,而不是直接从小到大排序,是为了避免负数反转后比原正数还大,从而导致最后还要重新排序。

优化

别的语言看到有用桶排序来优化排序的,JS的题解还是少了点。
image.png

复习

复习下arr.reduce的用法。

  1. var largestSumAfterKNegations = function(nums, k) {
  2. nums.sort((a,b)=>{
  3. return Math.abs(b) -Math.abs(a); //绝对值从大到小排序
  4. })
  5. for(let i =0;i<nums.length;i++){
  6. if(nums[i]<0&&k>0){
  7. nums[i] *=-1;
  8. k--;
  9. }
  10. }
  11. if(k>0&&k%2===1){
  12. //负数全转正后仍有奇数个k
  13. nums[nums.length-1] *= -1; //反转最小正数
  14. }
  15. return nums.reduce((a,b)=>{
  16. return a+b;
  17. })
  18. };