代码随想录算法训练营之JAVA|第二十九天|1005. K 次取反后最大化的数组和

今天是第29天刷leetcode,立个flag,打卡60天。

算法挑战链接

1005. K 次取反后最大化的数组和https://leetcode.cn/problems/maximize-sum-of-array-after-k-negations/

第一想法

题目理解:数组在进行K次取反后,求累加的最大值。

取反操作可重复用于同一个数字。

思路也是比较容易理解:先将数组进行排序,尽可能的将数组中的负数都转化成正数。如果数组都是被转化成正数后,且还需x次取反,如果x是偶数,则不需要操作,如果x是奇数,将全部正数的数组再次排序后,将第一个转换成负数。在计算数组的累加和即可。

代码如下:

class Solution {
    public int largestSumAfterKNegations(int[] nums, int k) {
        //第一次先排序
        Arrays.sort(nums);
        int temp = 0;
        for (int i = 0; i < k; i++) {
            int index = i % nums.length;
            if (nums[index]>=0) {
                //第二次排序
                Arrays.sort(nums);
                break;
            }
            temp++;
            nums[index] *= -1;
        }

        if ((k - temp)%2 == 1) {
            nums[0]*=-1;
        }
        int result = 0;
        for (int i = 0; i < nums.length; i++) {
            result+=nums[i];
        }
        return result;
    }
}

看完代码随想录之后的想法 

贪心算法的解题过程会更加的清晰易懂

本题的解题步骤为:

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

代码如下:

class Solution {
    public int largestSumAfterKNegations(int[] nums, int K) {
    	// 将数组按照绝对值大小从大到小排序,注意要按照绝对值的大小
	nums = IntStream.of(nums)
		     .boxed()
		     .sorted((o1, o2) -> Math.abs(o2) - Math.abs(o1))
		     .mapToInt(Integer::intValue).toArray();
	int len = nums.length;	    
	for (int i = 0; i < len; i++) {
	    //从前向后遍历,遇到负数将其变为正数,同时K--
	    if (nums[i] < 0 && K > 0) {
	    	nums[i] = -nums[i];
	    	K--;
	    }
	}
	// 如果K还大于0,那么反复转变数值最小的元素,将K用完

	if (K % 2 == 1) nums[len - 1] = -nums[len - 1];
	return Arrays.stream(nums).sum();

    }
}

你可能感兴趣的:(算法,java,开发语言)