[leetcode每日一題2021/2/1]888. 公平的糖果棒交換
公平的糖果棒交換
題目來源於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
a∈alice,
b
∈
b
o
b
b \isin bob
b∈bob
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分別為兩個陣列的長度。