LeetCode竞赛题:K 次取反后最大化的数组和(给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次。)
给定一个整数数组 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]。
思路:解决这个题就是将最小的数进行k次取反,具体步骤看代码
public static int largestSumAfterKNegations(int[] arr,int k) {
int sum = 0;
int count = 0;
//1.进行排序
Arrays.sort(arr);
//2.如果第一个元素大于0,那么就将第一个元素取k次反
if(arr[0]>0) {
while(k>0) {
arr[0] = -arr[0];
k--;
}
}else {
for(int i = 0;i<arr.length;i++) {
//3.第一个数小于0,直接取反count加1
if(arr[i] < 0 && count < k) {
arr[i] = -arr[i];
count++;
}else if(arr[i] == 0 &&count<k){
//4.第i个数为0,并且count小于k,那么我们对0进行取反操作,即直接break
break;
}else if(arr[i] > 0 && count <k){
//5.如果第i个数大于0,并且count小于k,那么我们将第i个数和第i-1的数做比较
//将小的数进行k-count次取反
if(arr[i] > arr[i-1])
arr[i - 1] = arr[i-1]*(int)Math.pow(-1,k - count);
else arr[i] = arr[i]*(int)Math.pow(-1,k - count);
break;
}
}
}
//6.求和
for(int i : arr)
sum += i;
return sum;
}