LeetCode 1005. K 次取反後最大化的數組和 (Java-超越99.66%.詳細解析)

題目

給定一個整數數組 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;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章