题目:
1.两个数组代表两个人每个糖果的大小
2.相互交换一个糖果,使得两个人的糖果大小总和相等
思路:
1.计算两个数组之和的差cha
2.交换数组间两个糖果的差为cha/2的糖果(和大的换小糖果)
3.其他情况返回{-1,-1}
暴力解法,时间复杂度:O(n^2)
代码:
class Solution {
public:
vector<int> fairCandySwap(vector<int>& A, vector<int>& B) {
int sumA = accumulate(A.begin(),A.end(),0);
int sumB = accumulate(B.begin(),B.end(),0);
int cha = (sumA-sumB)/2;
for (auto i :A)
for (auto j:B)
if(i-cha==j)
return {i,j};
return {-1, -1};
}
};
无序集合优化查找,时间复杂度:O(n)
代码:
class Solution {
public:
vector<int> fairCandySwap(vector<int>& A, vector<int>& B) {
int A_sum = accumulate(A.begin(), A.end(), 0);
int B_sum = accumulate(B.begin(), B.end(), 0);
int cha = (B_sum - A_sum) / 2;
unordered_set<int> Bset(B.begin(), B.end());
for (auto i:A)
if (Bset.count(i + cha)) return {i, i + cha};
return {-1, -1};
}
};
收获:
-
向量求和accumulate()
accumulate()定义在numeric中
用法为 accumulate(B.begin(),B.end(),0) -
遍历向量
用法为 for (auto i :A) – i 相当于A的某个元素 -
查询优化unordered_set的count() --时间复杂度为常数
count()定义在unordered_set中
用法为 unordered_set Bset(B.begin(),B.end());
Bset.count(i+cha) – count()会根据元素是否存在返回0或1