【1005.K次取反后最大化的数组和】
我的思路是,将数组排序,然后把最小的元素,也就是数组的第一个元素取反,然后再将数组排序,再把数组的第一个元素取反,重复k次就可以了。
我觉得我这也算是贪心,因为局部最优是每次取反最小的元素。k次之后就是全局最优。
我的代码如下:
class Solution {
public:
int largestSumAfterKNegations(vector<int>& nums, int k) {
int result = 0;
for(int i = 0; i < k; i++){
sort(nums.begin(), nums.end());
nums[0] = 0-nums[0];
}
for(int i = 0; i<nums.size(); i++){
result += nums[i];
}
return result;
}
};
代码随想录的解法是
首先将数组按照绝对值排序,然后将其中的尽可能多的负值全部反转。
如果还有多余的反转次数(此时数组已经全部都为正数),k为奇数,那么就把最小的值反转。
代码如下:
class Solution {
static bool cmp(int a, int b) {
return abs(a) > abs(b);
}
public:
int largestSumAfterKNegations(vector<int>& A, int K) {
sort(A.begin(), A.end(), cmp); // 第一步
for (int i = 0; i < A.size(); i++) { // 第二步
if (A[i] < 0 && K > 0) {
A[i] *= -1;
K--;
}
}
if (K % 2 == 1) A[A.size() - 1] *= -1; // 第三步
int result = 0;
for (int a : A) result += a; // 第四步
return result;
}
};
这个代码是比我的逻辑上要复杂一点点的,但是他说他是贪心,我觉得我更贪心呢。只不过我每次都要排序的操作会让我代码运行的时间变得很长。我只击败了5%的人。