思路1:对数组进行K次操作,每次操作都对数组中的每个最小元素进行取反操作
public int largestSumAfterKNegations(int[] A, int K) {
//计算数组中负数的个数
//遍历K次
//1、若数组中有负数,则将负数里面的最小值进行取反
//2、若数组里全为正数,则将最小的正数取反
//对最小的值取反
//进行K次循环
for(int i=0;i<K;i++){
//最小值
int minValue = A[0];
int minIndex = 0;
for(int t=0;t<A.length;t++){
if(A[t]<minValue){
minIndex=t;
minValue=A[t];
}
}
A[minIndex]=-minValue;
}
int sum = 0;
for(int i=0;i<A.length;i++) sum=sum+A[i];
return sum;
}
思路二
:先对数组中的所有负数进行取反,之后对剩余的K
次先进行数组排序然后对数组中的第一个元素进行K
次取反
public int largestSumAfterKNegations1(int[] A, int K) {
//对数组排揎
Arrays.sort(A);
//先对数组里的负数尽可能进行发展
for(int i=0;i<A.length;i++)
{
if(K>0&&A[i]<0)
{
A[i]=-A[i];
K--;
}
}
//此时如果K被用完了,那是最好的,如果K没有被用完。
Arrays.sort(A);
if(K%2!=0) //还剩下的次数,K没被用完,说明剩下的都是正数了
A[0]=-A[0]; //若剩下的是偶数次,相当于不变,奇数次可以只变1次
int result=0;
for(int num:A)
result+=num;
return result;
}