1 题目概述
难度:容易
2 思路变迁
- 毋庸置疑 第一步就是排序。
/ - 本来想着是负的变正的,直到逢正的不断变换。
完事后加起来。
忽然发现不对。比如:
[-1, 2 ,3] 变2次
变换一次之后:
[1,2,3]
按我的思路在变一次
[1,-2,3]
这样就不对了正确了,正确结果应该是:
[-1,2,3]
- 因此我明白了负数每变一次之后,给它重拍一下序。
而且只考虑第一个数。因为他最小。
每考虑一次,k变小1就可以控制变换次数。 - 逢不到正数最好,逢到正数就无限变换它。
- 最好遍历求sum。
3 代码开搂
import java.util.*;
class Solution {
public int largestSumAfterKNegations(int[] A, int K) {
//先对数组进行排序 可以自己写 写可以用Arrays.sorts();
// int i ,j,temp;
// for(i = A.length-2; i >= 0 ; i --){
// for(j = 0 ; j <= i ; j ++ ){
// if(A[j+1] < A[j]){
// temp = A[j+1];
// A[j+1] = A[j];
// A[j] = temp;
// }
// }
// }
Arrays.sort(A);
//System.out.println(Arrays.toString(A));
//负数直接依次取相反数 尽可能取多个
//负数如果全部变完了 数量还没达到K 再重新排序
int i,count = 0; //count记录反转了几次
for(i = 0; i < K; ){
if(A[i] < 0){
A[i] = (-1)*A[i]; //小于0变相反数
Arrays.sort(A); //同时重排序
K --; //变换次数减一
}else{
A[i] = (int)Math.pow(-1,K)*A[i]; //碰到大于等于0的 直接不停变换他好了
break;
}
}
int j = 0,sum = 0;
for(j = 0 ; j <= A.length -1 ; j++ ){
sum += A[j];
}
return sum;
}
}
可是我的做法好垃圾?大家有更好的方法吗?