1. 程式人生 > 其它 >C++描述 LeetCode 888. 公平的糖果棒交換

C++描述 LeetCode 888. 公平的糖果棒交換

技術標籤:LeetCode

C++描述 LeetCode 888. 公平的糖果棒交換

  大家好,我叫亓官劼(qí guān jié ),在CSDN中記錄學習的點滴歷程,時光荏苒,未來可期,加油~博主目前僅在CSDN中寫部落格,唯一部落格更新的地址為:亓官劼的部落格 ,同時正在嘗試在B站中做一些內容分享,B站主頁為: 亓官劼的B站主頁

本文原創為亓官劼,請大家支援原創,部分平臺一直在惡意盜取博主的文章!!!
若需聯絡博主,可以聯絡本人微信:qiguanjie2015


愛麗絲和鮑勃有不同大小的糖果棒:A[i] 是愛麗絲擁有的第 i 根糖果棒的大小,B[j]

是鮑勃擁有的第 j 根糖果棒的大小。

因為他們是朋友,所以他們想交換一根糖果棒,這樣交換後,他們都有相同的糖果總量。(一個人擁有的糖果總量是他們擁有的糖果棒大小的總和。)

返回一個整數陣列 ans,其中 ans[0] 是愛麗絲必須交換的糖果棒的大小,ans[1] 是 Bob 必須交換的糖果棒的大小。

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

示例 1:

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

示例 2:

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

示例 3:

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

示例 4:

輸入: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
  • 保證愛麗絲與鮑勃的糖果總量不同。
  • 答案肯定存在。

題解思路

採用雜湊表,儲存B中每個值。分別求和A和B內所有的值。則對於A中每個值A[i],我們只需要找到B中的一個數x,使得suma - A[i] + x == sumb - x + A[i]即可,化簡得x = (sumb-suma)/2 + A[i]],即只要B中有值為(sumb-suma)/2 + A[i]]

的,即可進行交換。

演算法實現

class Solution {
public:
    vector<int> fairCandySwap(vector<int>& A, vector<int>& B) {
        int suma,sumb;
        unordered_map<int,int> hash;

        suma = sumb = 0;
        for(int i = 0; i < A.size(); i++)
            suma += A[i];
        for(int i = 0; i < B.size(); i++)
            sumb += B[i],hash[B[i]]++;
        for(int i = 0; i < A.size(); i++){
            if(hash[(sumb-suma)/2 + A[i]] != 0) {
                return {A[i],(sumb-suma)/2 + A[i]};
            }
        }
        return {};
    }
};