Sgg:(LeetCode每日一题)--1004_K次取反后的最大化的数组和

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

1 题目概述

难度:容易

在这里插入图片描述
在这里插入图片描述

2 思路变迁

  1. 毋庸置疑 第一步就是排序。
    /
  2. 本来想着是负的变正的,直到逢正的不断变换。
    完事后加起来。
    忽然发现不对。比如:
[-1, 2 ,3] 变2次
变换一次之后:
[1,2,3]
按我的思路在变一次
[1,-2,3]

这样就不对了正确了,正确结果应该是:

[-1,2,3]
  1. 因此我明白了负数每变一次之后,给它重拍一下序。
    而且只考虑第一个数。因为他最小。
    每考虑一次,k变小1就可以控制变换次数。
  2. 逢不到正数最好,逢到正数就无限变换它。
  3. 最好遍历求sum。

3 代码开搂

import java.util.*;
class Solution {
    public int largestSumAfterKNegations(int[] A, int K) {
        //先对数组进行排序 可以自己写 写可以用Arrays.sorts();

        // int i ,j,temp;
        // for(i = A.length-2; i >= 0 ; i --){
        //     for(j = 0 ; j <= i ; j ++ ){
        //         if(A[j+1] < A[j]){
        //             temp = A[j+1];
        //             A[j+1] = A[j];
        //             A[j] = temp;
        //         }
        //     }
        // }

        Arrays.sort(A);

        //System.out.println(Arrays.toString(A));

        //负数直接依次取相反数 尽可能取多个
        //负数如果全部变完了 数量还没达到K 再重新排序 

        int i,count = 0;   //count记录反转了几次 

        for(i = 0; i < K; ){
            if(A[i] < 0){
                A[i] = (-1)*A[i];   //小于0变相反数
                Arrays.sort(A);     //同时重排序
                K --;   //变换次数减一
            }else{
                A[i] = (int)Math.pow(-1,K)*A[i]; //碰到大于等于0的 直接不停变换他好了
                break; 
            }
        }

        int j = 0,sum = 0;
        for(j = 0 ; j <= A.length -1 ; j++ ){
            sum += A[j];
        }
        return sum;
    }
}

可是我的做法好垃圾?大家有更好的方法吗?
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值