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

一 题目:

二 思路:

  • 优先把最小的负数反转为正,其次反转最小的正数
    -** 代码很多可以合并的if else我为了逻辑清晰没有合并,打击凑合着看,虽然写了一坨💩**

三 代码:

 public int largestSumAfterKNegations(int[] nums, int k) {
        //优先把最小的负数反转为正,其次反转最小的正数
        Arrays.sort(nums);
        int sum=0;
        Integer x=null;
        for (int i = 0; i < nums.length; i++) {
            x= x==null?Math.abs(nums[i]):Math.min(x,Math.abs(nums[i]));
            if (k==0){
                //已经到目标次数了,不需要翻转了,直接加
                sum+=nums[i];
            }else {
                //如果还需要反转
                // 还有负数
                if (nums[i]<0){
                    //sum加这个数的整数
                    sum+=(-nums[i]);
                    k--;
                }else {
                    //如果k是偶数相当于来回反转,不用管,直接快进到0
                    if (k%2==0){
                        k=0;
                    }else {
                        //如果是奇数,就需要让最小正数反转一次,并把之前加的需要减掉
                        sum-=2*(x);
                        k=0;
                    }

                    sum+=nums[i];
                }
            }
        }
        //如果k还是大于0,直接拷贝的上面的else逻辑,所以这里没有去掉无用的if和k,尽量让大家知道这是和上面对于富裕的k一样的逻辑
        if (k>0){
            //如果k是偶数相当于来回反转,不用管,直接快进到0
            if (k%2==0){
                k=0;
            }else {
                //如果是奇数,就需要让最小正数反转一次,并把之前加的需要减掉
                sum-=2*(x);
                k=0;
            }
        }

        return sum;
    }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容