当前位置: 首页 > news >正文

LeetCode 1005. K 次取反后最大化的数组和 java题解

https://leetcode.cn/problems/maximize-sum-of-array-after-k-negations/description/

看着简单但是写si人的一题。

class Solution {
    public int largestSumAfterKNegations(int[] nums, int k) {
        Arrays.sort(nums);//排序
        int last_negative=-1,first_positive=-1;//最后一个负数位置,第一个正数位置
        //计数
        int count_zero=0;
        int count_negative=0;
        int count_positive=0;
        for(int i=0;i<nums.length;i++){
            if(nums[i]<0){//负数
                last_negative=i;
                count_negative++;
            }
            else if(nums[i]>0){//正数
                if(count_positive==0){//前面,没有出现过正数
                    first_positive=i;
                }
                count_positive++;
            }
            else{//0
                count_zero++;
            }
        }

//开始变化
        if(count_negative>=k){//1.有足够的负数。负数变正数。
            for(int i=0;i<k;i++){//修改k次
                nums[i]=-nums[i];
            }
        }
        else if(0<count_negative&&count_negative<k){//2.有负数,但不够。
            //先修改已有的负数
            for(int i=0;i<count_negative;i++){//从前到后,修改所有负数。剩下的交给0
                nums[i]=-nums[i];
            }      
            int left=k-count_negative;//还需要修改的次数
            if(left%2==0){// 2.1 还剩下偶数次
                //不用改了
            }
            
            //2.2 有零。修改0
            else if(count_zero>0){
                //也可以说不用改了
            }
            else{//2.3 有负数,但不够,还剩奇数次,还没有0
                int a=Integer.MAX_VALUE;
                int b=Integer.MAX_VALUE;
                if(count_positive>0){//有正数
                    a=nums[first_positive];
                }
                if(count_negative>0){
                    b=nums[last_negative];
                }
                //取绝对值小的数
                if(Math.abs(a)<Math.abs(b)){
                    nums[first_positive]=-nums[first_positive];
                }
                else{
                    nums[last_negative]=-nums[last_negative];
                }
            }
        }
        else if(count_negative==0){//3.没有负数
            if(count_zero!=0){
                //3.1 有零。不用改了。
            }
            else{//3.2 没有零。
                if(k%2==0){//偶数次,变回自己
                    //不用改了
                }
                else{
                    //修改最小的正数
                    if(count_positive!=0){
                        nums[first_positive]=-nums[first_positive];
                    }
                }
            }
        }
        int sum=0;
        for(int num:nums)
            sum+=num;
        return sum;
    }
}
/**
把负数变成正的,下标越小越好
不想继续改变,如果有0,就改变0
把正数变成负的,下标越小越好
变k次,可以多次选择同一个下标。
 */

网上的思路

第一步:将数组按照绝对值大小从大到小排序,注意要按照绝对值的大小
第二步:从前向后遍历,遇到负数将其变为正数,同时K–
第三步:如果K还大于0,那么反复转变数值最小的元素,将K用完
第四步:求和

相关文章:

  • C语言 —— 此去经年梦浪荡魂音 - 深入理解指针(卷二)
  • SpringBoot3+Druid+MybatisPlus多数据源支持,通过@DS注解配置Service/Mapper/Entity使用什么数据源
  • Windows11 新机开荒(二)电脑优化设置
  • C++ 类和对象 友元 内部类 this指针 默认成员函数 初始化列表……
  • Pandas DataFrame:数据分析的利器
  • 14 结构体
  • WebSocket和长轮询
  • 【操作系统】Ch6 文件系统
  • 【最后203篇系列】015 几种消息队列的思考
  • ORA-00600错误的深度剖析:如何避免与解决?
  • 蓝桥杯宝石,考察数学。考察公式推导能力
  • 设计模式(行为型)-命令模式
  • 【MySQL】MySQL数据存储机制之存储引擎
  • Vim 编辑器-实现基础跳转
  • MCP 开放协议
  • 55-交换机堆叠
  • P4924 [1007] 魔法少女小Scarlet
  • 模板初阶:
  • 判断一个数是否是质数(素数)
  • 【递归与动态规划(DP) C/C++】(1)递归 与 动态规划(DP)
  • 习近平会见智利总统博里奇
  • 阿尔巴尼亚执政党连续第四次赢得议会选举,反对党此前雇用特朗普竞选经理
  • 四部门:到2025年底,全国行政村5G通达率超过90%
  • 习近平将出席中国—拉美和加勒比国家共同体论坛第四届部长级会议开幕式并发表重要讲话
  • 巴西总统卢拉将访华
  • 新修订的《婚姻登记条例》明起施行,领证不用户口本了