1. 程式人生 > 其它 >[leetcode每日一題2021/2/1]888. 公平的糖果棒交換

[leetcode每日一題2021/2/1]888. 公平的糖果棒交換

技術標籤:演算法leetcode

公平的糖果棒交換

題目來源於leetcode,解法和思路僅代表個人觀點。傳送門
難度:簡單(也不見得簡單啊)
時間:20min

題目

愛麗絲和鮑勃有不同大小的糖果棒: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
保證愛麗絲與鮑勃的糖果總量不同。

答案肯定存在。

思路

交換之後,總量相等,就有公式:
a = s u m a l i c e + s u m b o b 2 + b a = {sum_{alice}+sum_{bob} \over 2} + b a=2sumalice+sumbob+b
其中, a ∈ a l i c e a \isin alice aalice b ∈ b o b b \isin bob bbob

O(n²)

依次列舉,遍歷完n²,超時

O(nlogm)

這裡可以比較alice和bob陣列的大小,使用較大的一遍二分查詢,快一點。
列舉一邊,二分查詢另一邊,超時

看了一下評論區,如果兩邊都使用二分查詢

的話,好像能過。

O(max(n,m))

列舉一邊,另一邊用雜湊set查詢,通過

如果使用alice與bob較大的一方做hashset的話,時間複雜度可以達到O(min(n,m))。


所以,分析演算法時間複雜度,可以讓思維能有一個遞進的過程。

程式碼

class Solution {
public:
    //二分查詢,保證arr有序
    // bool find(vector<int> arr,int target,int l,int r){
    //     if(l>r){
    //         return false;
    //     }
    //     int mid = (l + r)/2;
    //     if(arr[mid] == target){
    //         return true;
    //     }
    //     return find(arr,target,l,mid-1) || find(arr,target,mid+1,r);
    // }
    vector<int> fairCandySwap(vector<int>& A, vector<int>& B) {
        int alice = 0;
        int bob = 0;
        vector<int> ans;
        for(auto a:A){
            alice += a;
        }
        for(auto b:B){
            bob += b;
        }
        //n²過不了
        // for(int i=0;i<A.size();i++){
        //     for(int j=0;j<B.size();j++){
        //         if(alice-A[i]+B[j] == bob-B[j]+A[i]){
        //             return vector<int>{A[i],B[j]};
        //         }
        //     }
        // }

        // nlog(m)過不了
        // sort(B.begin(),B.end());
        // //知道:a = (alice-bob)/2 + b
        // for(int i=0;i<A.size();i++){
        //     int a = A[i];
        //     int b = a - (alice-bob)/2;
        //     if(find(B,b,0,B.size()-1)){
        //         return vector<int>{a,b};
        //     }
        // }

        unordered_set<int> set;
        // 時間:max(n,m)
        // 空間:max(n,m)
        // 雜湊對映
        for(int j=0;j<B.size();j++){
            set.insert(B[j]);
        }
        for(int i=0;i<A.size();i++){
            int a = A[i];
            int b = a - (alice-bob)/2;
            if(set.count(b)){
                return vector<int>{a,b};
            }
        }
        return ans;
    }
};

演算法複雜度

時間複雜度: 使用hashset的話,可以達到O(max(m,n))。n,m分別為兩個陣列的長度。

空間複雜度: O(max(n,m))。n,m分別為兩個陣列的長度。

在這裡插入圖片描述