1005. K 次取反后最大化的数组和
思路:桶排序
桶排序适用于数据范围较小,但是数个数较多的场景。这个时候我们直接统计每个数出现的次数,进而计算总和。
如果最后
k
k
k个数大于负数的个数,判断奇偶性,减去两倍的绝对值最小的数即可
时间复杂度: O ( n ) O(n) O(n)
空间复杂度: C ( 200 ) C(200) C(200)
class Solution {
public:
int largestSumAfterKNegations(vector<int>& nums, int k) {
unordered_map<int, int> cnt;
int t = 1e8;
for (auto& num : nums) {
cnt[num] ++ ;
t = min(t, abs(num));
}
for (int i = -100; i < 0 && k > 0; i ++ ) {
while (cnt[i] > 0 && k > 0) {
cnt[i] -- ;
cnt[-i] ++ ;
k -- ;
}
}
int res = 0;
for (int i = -100; i <= 100; i ++ )
res += cnt[i] * i;
if (k % 2 != 0) res -= 2 * t;
return res;
}
};