leetcode——公平的糖果棒交易

题目:
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};
    }
};

收获:

  1. 向量求和accumulate()
    accumulate()定义在numeric中
    用法为 accumulate(B.begin(),B.end(),0)

  2. 遍历向量
    用法为 for (auto i :A) – i 相当于A的某个元素

  3. 查询优化unordered_set的count() --时间复杂度为常数
    count()定义在unordered_set中
    用法为 unordered_set Bset(B.begin(),B.end());
    Bset.count(i+cha) – count()会根据元素是否存在返回0或1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值