題目
給定一個整數數組 A,我們只能用以下方法修改該數組:我們選擇某個個索引 i 並將 A[i] 替換爲 -A[i],然後總共重複這個過程 K 次。(我們可以多次選擇同一個索引 i。)
以這種方式修改數組後,返回數組可能的最大和。
解題思路
(1).K>0則執行(2),否則執行(4)
(2).取數組A[]中的最小值,並取反.
(3).K–.返回(1)
(4).對數組A[]求和
注意點
第(2)步取最小值取得是新數組的最小值.
具體解法
我這裏參考了前幾名的答案,通過使用number[]數組,將各數字出現次數存入其中,可不排序就快速找到最小值.
class Solution {
public int largestSumAfterKNegations(int[] A, int K) {
int[] number = new int[201];//-100 <= A[i] <= 100,這個範圍的大小是201
for (int t : A) {
number[t + 100]++;//將[-100,100]映射到[0,200]上
}
int i = 0;
while (K > 0) {
while (number[i] == 0)//找到A[]中最小的數字
i++;
number[i]--;//此數字個數-1
number[200 - i]++;//其相反數個數+1
if (i > 100) {//若原最小數索引>100,則新的最小數索引應爲200-i.(索引即number[]數組的下標)
i = 200 - i;
}
K--;
}
int sum = 0;
for (int j = i; j <number.length ; j++) {//遍歷number[]求和
sum += (j-100)*number[j];//j-100是數字大小,number[j]是該數字出現次數.
}
return sum;
}
}