LeetCode.888-公平的糖果交換(Fair Candy Swap)

這是悅樂書的第339次更新,第363篇原創

01 看題和準備

今天介紹的是LeetCode算法題中Easy級別的第208題(順位題號是888)。Alice和Bob有不同大小的糖果棒:A[i]是Alice擁有的第i個糖果棒的大小,B[j]是Bob擁有的第j個糖果棒的大小。

由於他們是朋友,他們想交換一個糖果,以便交換後,他們都有相同的糖果總量。 (一個人擁有的糖果總量是他們擁有的糖果大小的總和。)

返回一個整數數組ans,其中ans[0]是Alice必須交換的糖果的大小,ans[1]是Bob必須交換的糖果的大小。

如果有多個答案,你可以返回其中任何一個。答案保證存在。例如:

輸入:A = [1,1],B = [2,2]
輸出:[1,2]

輸入:A = [1,2],B = [2,3]
輸出:[1,2] [2,3]

輸入:A = [2],B = [1,3]
輸出:[2,3]

輸入:A = [1,2,5],B = [2,4]
輸出:[5,4]

注意

  • 1 <= A.length <= 10000

  • 1 <= B.length <= 10000

  • 1 <= A [i] <= 100000

  • 1 <= B [i] <= 100000

  • 保證Alice和Bob的糖果總量不同。

  • 保證有答案。

本次解題使用的開發工具是eclipse,jdk使用的版本是1.8,環境是win7 64位系統,使用Java語言編寫和測試。

02 第一種解法

Alice和Bob的糖果總量不一樣,要想答案肯定存在,他們兩人的糖果總量差值肯定爲偶數,只有差值爲偶數時,對差值進行平分得到一個平均值,糖果總量多的一方減去平均值,少的一方加上平均值,此時兩人的糖果總量是相等的。

因此,我們只需要求出兩人的糖果總量差值的平均數,拿此平均數加上一方中的任意一個糖果的大小,去匹配另外一方中的糖果大小,能夠匹配上,說明這兩個糖果是需要雙方交換的,在此情景下,此題有點類似於Two Sum。

public int[] fairCandySwap(int[] A, int[] B) {
    int[] result = new int[2];
    // 存儲A中的元素(換成B也行)
    Set<Integer> set = new HashSet<Integer>();
    int sumA = 0;
    for (int a : A) {
        sumA += a;
        set.add(a);
    }
    int sumB = 0;
    for (int b : B) {
        sumB += b;
    }
    // 兩人糖果總量之差的平均數
    int num = (sumA-sumB)/2;
    // 遍歷B中元素,加上差值平均數去另外一個數組裏匹配,
    // 能匹配上,表明遇到了需要交換的元素。
    for (int b : B) {
        if (set.contains(b+num)) {
            return new int[]{b+num, b};
        }
    }
    return result;
}


03 第二種解法

針對第一種解法使用的HashSet,我們還可以換成另外的數據結構來代替,使用一個boolean類型的數組來存儲A中的值,其他思路不變。

public int[] fairCandySwap2(int[] A, int[] B) {
    int[] result = new int[2];
    boolean[] set = new boolean[100001];
    int sumA = 0;
    for (int a : A) {
        sumA += a;
        set[a] = true;
    }
    int sumB = 0;
    for (int b : B) {
        sumB += b;
    }
    int num = (sumA-sumB)/2;
    for (int b : B) {
        if (b+num > 0 && b+num < 100001 && set[b+num]) {
            return new int[]{b+num, b};
        }
    }
    return result;
}


04 小結

算法專題目前已連續日更超過六個月,算法題文章208+篇,公衆號對話框回覆【數據結構與算法】、【算法】、【數據結構】中的任一關鍵詞,獲取系列文章合集。

以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支持!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章