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次,该如何操作才能使得总和最大。
这题得想明白才好做,不然做不好。我的思路如下:
class MaximizeSumOfArrayAfterKNegations : public Solution {
public:
void Execute() {
std::cout << "Case 1: " << largestSumAfterKNegations(vector<int>{-1, -2, -3}, 8);
}
int largestSumAfterKNegations(const vector<int>& A, int K) {
int sum = 0;
int posMin = A[0];
vector<int> negs;
for (auto v : A) {
sum += v;
if (v < 0) {
negs.push_back(v);
} else if (v < posMin || (v >= 0 && posMin < 0)) {
posMin = v;
}
}
std::sort(negs.begin(), negs.end());
int negi = 0;
while (K > 0 && negi < negs.size()) {
sum += (2 * -negs[negi++]);
K--;
if (-negs[negi - 1] < posMin || (-negs[negi - 1] >= 0 && posMin < 0)) {
posMin = -negs[negi - 1];
}
}
if ((K % 2) != 0) {
// Minus the smallest element
sum -= posMin * 2;
}
return sum;
}
};
这种解法速度还不错,超过了99.66%的解法