首页 > 编程语言 > 详细

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

时间:2021-07-19 22:56:07      阅读:17      评论:0      收藏:0      [点我收藏+]

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

题目

给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次。(我们可以多次选择同一个索引 i。)

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

示例 1:

输入:A = [4,2,3], K = 1
输出:5
解释:选择索引 (1,) ,然后 A 变为 [4,-2,3]。

示例 2:

输入:A = [3,-1,0,2], K = 3
输出:6
解释:选择索引 (1, 2, 2) ,然后 A 变为 [3,1,0,2]。

示例 3:

输入:A = [2,-3,-1,5,-4], K = 2
输出:13
解释:选择索引 (1, 4) ,然后 A 变为 [2,3,-1,5,4]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximize-sum-of-array-after-k-negations
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解

每次需要变换的都是最小的数。这里就需要找出最小的数。

对于有负数的数组,从最小值的开始变,直到k用完或者没有负数了。
对于全是正数的数组,k为偶数的时候不用变化,k为奇数的时候,操作一次最小数就行了。

可以先对数组进行从小到大的排序,但是变化之后的数组不一定也是有序的。

方法1:先把所有的负数变为正数,在循环过程中维护最小值,如果全正之后k还没有用完,就操作最小值。

方法2:为了让变化之后的数组仍然以一定的规则有序,可以使用对绝对值大小进行排序,这样变化之后的绝对值大小是不变的。这样不用去维持最小值,最小值为sum[0]。

排序+维护最小值min

class Solution {
    public int largestSumAfterKNegations(int[] nums, int k) {
        int len = nums.length;
        int sum=0;
        int min=Integer.MAX_VALUE;
        Arrays.sort(nums); //排序
        for(int i=0;i<len;i++){
	//负数变成正数,k--
            if(nums[i]<0 && k>0){
                nums[i]=-nums[i];
                --k;
            }
            if(min>nums[i]) min=nums[i]; //维持最小值
            sum+=nums[i]; //求和
        }//结束之后元素全是正数
        if(k==0||k%2==0) return sum;
        return sum-min*2;
    }
}

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

原文:https://www.cnblogs.com/rananie/p/15032431.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!