一个数组每次选一个*(-1),K次后求最大sum。
思路:
1. 维护最小堆,either in place or not.
2. 细分析负数数量和K奇偶.
- K<=#负数:翻转最小的K个负数
- K>#负数:翻转所有负数
- (K-#负数)为偶,res=sum
- (K-#负数)为奇,res=sum-min*2
C++
heap
class Solution {
public:
int largestSumAfterKNegations(vector<int>& A, int K) {
multiset<int> s;
int res = 0;
for (auto x: A) {
s.insert(x);
res += x;
}
while(K--) {
int tmp = *s.begin();
s.erase(s.begin());
s.insert(tmp * -1);
res = res - tmp*2;
}
return res;
}
};
class Solution {
public:
int largestSumAfterKNegations(vector<int>& A, int K) {
int res = 0;
int cnt = 0;
sort(A.begin(), A.end());
int min_v;
for (int i=0; i<A.size(); i++) {
if (A[i]<0 && cnt++<K)
A[i] = -A[i];
min_v = min(min_v, A[i]);
res += A[i];
}
if ((cnt > K) || (K-cnt)%2 == 0)
return res;
return res - 2 * min_v;
}
};
Python
class Solution(object):
def largestSumAfterKNegations(self, A, K):
"""
:type A: List[int]
:type K: int
:rtype: int
"""
s = sum(A)
heapq.heapify(A)
while K > 0:
min_v = heapq.heappop(A)
heapq.heappush(A, -min_v)
K = K-1
s += -2*min_v
return s
class Solution(object):
def largestSumAfterKNegations(self, A, K):
for _ in range(K):
A.sort()
A[0]=-A[0]
return sum(A)
class Solution(object):
def largestSumAfterKNegations(self, A, K):
A.sort()
i = 0
while i<len(A) and i<K and A[i]<0:
A[i] = -A[i]
i += 1
if (K-i) % 2:
return sum(A)-min(A)*2
return sum(A)
碎碎念:
遥想第一次刷lc的时候才只有一百多题啊一百多,今天打开看着标号1500+...真的是一脸懵逼+绝望...