LeetCode之4Sum II

本题的意思是给定四个长度相同的整数数组,对它们分别给定四个下标,使得这四个下标对应的数加起来为0,求满足这样条件的下标有多少组。

我利用map这个数据结构的特点来解决此题。将前两个数组的元素两两相加,将这个和放入第一个map中,如果遇到相同的和,则增加map中那个和的次数;对于后两个数组和第二个map,进行相同的操作。然后遍历第一个map,对第一个map中所有的和,在第二个map中寻找其相反数,然后将两者的次数相乘,累加到结果中,表示这两个和相加为0的情况总共有这么多组下标。遍历完后,累加完的结果即为所求。

class Solution {
    public:
        int fourSumCount(vector<int>& A, vector<int>& B, vector<int>& C, vector<int>& D) {
            unordered_map<int, int> sum1, sum2;
            int n = A.size();
            
            for (int i = 0; i < n; ++i) {
                for(int j = 0; j < n; ++j) {
                    ++sum1[A[i] + B[j]];
                    ++sum2[C[i] + D[j]];
                }
            }
            
            int count = 0;
            
            for (unordered_map<int, int>::iterator iter_ = sum1.begin(); iter_ != sum1.end(); ++iter_) {
                unordered_map<int, int>::iterator iter_1 = sum2.find(-iter_ -> first);
                
                if (iter_1 != sum2.end()) {
                    count += iter_ -> second * iter_1 -> second;
                }
            }
            
            return count;
        }
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值