12月6日每日一题

这篇博客介绍了一种算法,用于在给定整数数组和整数k的情况下,通过选择并翻转数组元素来最大化数组的和。算法首先对数组进行排序,然后根据k的奇偶性决定是否将最小的正数变为负数以达到最大和。在k为偶数时,数组元素和保持不变;在k为奇数时,将最小的正数变为负数以最大化和。博主通过示例代码展示了如何实现这一过程。
摘要由CSDN通过智能技术生成

输入一个整数数组和一个整数k,按以下方式修改该数

1.选择某个下标 i 并将 nums[i] 替换为 -nums[i]

2.重复这个过程恰好 k 次。可以多次选择同一个下标 i 。

以这种方式修改数组后,返回数组可能的最大和 。

(这次还是交博客链接)

输入:nums = [4,2,3], k = 1

输出:5

解释:选择下标 1 ,nums 变为 [4,-2,3] 。

输入:nums = [3,-1,0,2], k = 3

输出:6

输入:nums = [2,-3,-1,5,-4], k = 2

输出:13

输入:nums = [-2,5,0,2,-2],k = 3

输出:11

其中

1 <= nums.length <= 10000

-100 <= nums[i] <= 100

1 <= k <= 10000

import java.util.Arrays;

/**
 * @author jitwxs
 * @date 2021年12月06日 11:42
 */
public class Day04 {
    public static void main(String[] args) {
        int nums[] = new int[]{2,-3,-1,5,-4};//初始化数组
        int i = nums.length;//获取数组长度赋值给i
        int sum = 0;
        int k = 2;
        Arrays.sort(nums);
        for (int j = 0; j < i; j++) {//先把数组中的负值换为正值,每换一次k-1,如果k的值小于数组中
            if(nums[j] < 0 && k > 0){//中负数的个数,要得到和的最大值就要先把绝对值大的
                nums[j] = -nums[j];//先改为正值,因此要先进行一个排序,然后挨个改为正值直到k等于0;
                k--;
            }
        }
        for (int j = 0;j < i;j++){//当k的值为0时数组值不会发生变化,当k为偶数时,要得到最大值,
            sum += nums[j];//只能将一个数变正在变负,最后数组元素和不变都为sum
        }
        if (k % 2 == 0 || k == 0){
            System.out.println(sum);//当k为0或k为偶数时输出sum
        }else{
            Arrays.sort(nums);//当k的值为奇数时肯定要把数组中的一个数变为负值,要把数组中最小的值变为负值可以得到和最大,
            nums[0] = -nums[0];//上次排完序后因为有值发生了变化,所以要再排序一次,把最小值改为负值
            sum = 0;           //上面sum已经有值要先把sum改为0,再遍历数组求和,输出和最大
            for (int j = 0; j < i; j++) {

                sum += nums[j];
            }
            System.out.println(sum);
        }

    }
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值