【题目】
给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次。(我们可以多次选择同一个索引 i。)
以这种方式修改数组后,返回数组可能的最大和。
示例 1:
输入:A = [4,2,3], K = 1
输出:5
解释:选择索引 (1,) ,然后 A 变为 [4,-2,3]。
示例 2:
输入:A = [3,-1,0,2], K = 3
输出:6
解释:选择索引 (1, 2, 2) ,然后 A 变为 [3,1,0,2]。
示例 3:
输入:A = [2,-3,-1,5,-4], K = 2
输出:13
解释:选择索引 (1, 4) ,然后 A 变为 [2,3,-1,5,4]。
提示:
1 <= A.length <= 10000 1 <= K <= 10000 -100 <= A[i] <= 100
【思路】
显而易见,求数组和的最大值,当存在负数时,则最小的负数取相反数;当不存在负数时,则最小的正数取相反数。
【代码】
python版本
class Solution(object):
def largestSumAfterKNegations(self, A, K):
"""
:type A: List[int]
:type K: int
:rtype: int
"""
A.sort()
count_neg = len(filter(lambda x: x<0, A))
# 更改前min(K, count_neg)个负数为相反数
if count_neg >= K:
A[:K] = list(map(lambda x: -x, A[:K]))
else:
A[:count_neg] = list(map(lambda x: -x, A[:count_neg]))
# 全是正数,重新排序
A.sort()
if (K - count_neg) % 2 == 1:
A[0] = -A[0]
return sum(A)
C++版本
class Solution {
public:
int largestSumAfterKNegations(vector<int>& A, int K) {
sort(A.begin(), A.end());
// 计算负数个数
int count_neg = 0;
for(int i=0; i<A.size(); i++){
if(A[i] >= 0)
break;
count_neg++;
}
// 更改前min(K, count_neg)个负数为相反数
if(count_neg >= K){
for(int i=0; i<K; i++)
A[i] = -A[i];
}else{
for(int i=0; i<count_neg; i++)
A[i] = -A[i];
// 重新排序
sort(A.begin(), A.end());
if((K - count_neg) % 2 == 1)
A[0] = -A[0];
}
// 求和
int res = 0;
for(int i=0; i<A.size(); i++)
res += A[i];
return res;
}
};