題目

Given an array A of integers, we must modify the array in the following way: we choose an i and replace A[i] with -A[i], and we repeat this process K times in total. (We may choose the same index i multiple times.)

Return the largest possible sum of the array after modifying it in this way.

Example 1:

Input: A = [4,2,3], K = 1
Output: 5
Explanation: Choose indices (1,) and A becomes [4,-2,3].

Example 2:

Input: A = [3,-1,0,2], K = 3
Output: 6
Explanation: Choose indices (1, 2, 2) and A becomes [3,1,0,2].

Example 3:

Input: A = [2,-3,-1,5,-4], K = 2
Output: 13
Explanation: Choose indices (1, 4) and A becomes [2,3,-1,5,4].

Note:

  • 1 <= A.length <= 10000
  • 1 <= K <= 10000
  • -100 <= A[i] <= 100

題目大意

將數組中的元素變成它的相反數,這種操作執行 K 次之後,求出數組中所有元素的總和最大。

解題思路

這一題可以用最小堆來做,構建最小堆,每次將最小的元素變成它的相反數。然後最小堆調整,再將新的最小元素變成它的相反數。執行 K 次以後求數組中所有的值之和就是最大值。

這道題也可以用排序來實現。排序一次,從最小值開始往後掃,依次將最小值變為相反數。這裏需要注意一點,負數都改變成正數以後,接着不是再改變這些變成正數的負數,而是接着改變順序的正數。因為這些正數是比較小的正數。負數越小,變成正數以後值越大。正數越小,變成負數以後對總和影響最小。具體實現見代碼。 �具體實現見代碼。

參考代碼

package leetcode

import (
	"sort"
)

func largestSumAfterKNegations(A []int, K int) int {
	sort.Ints(A)
	minIdx := 0
	for i := 0; i < K; i++ {
		A[minIdx] = -A[minIdx]
		if A[minIdx+1] < A[minIdx] {
			minIdx++
		}
	}
	sum := 0
	for _, a := range A {
		sum += a
	}
	return sum
}