题目
给你一个 下标从 0 开始 的整数数组 nums ,返回满足下述条件的 不同 四元组 (a, b, c, d) 的 数目 :
- nums[a] + nums[b] + nums[c] == nums[d] ,且
- a < b < c < d
示例 1:
输入:nums = [1,2,3,6] 输出:1 解释:满足要求的唯一一个四元组是 (0, 1, 2, 3) 因为 1 + 2 + 3 == 6 。
示例 2:
输入:nums = [3,3,6,4,5] 输出:0 解释:[3,3,6,4,5] 中不存在满足要求的四元组。
示例 3:
输入:nums = [1,1,1,3,5] 输出:4 解释:满足要求的 4 个四元组如下: - (0, 1, 2, 3): 1 + 1 + 1 == 3 - (0, 1, 3, 4): 1 + 1 + 3 == 5 - (0, 2, 3, 4): 1 + 1 + 3 == 5 - (1, 2, 3, 4): 1 + 1 + 3 == 5
解题
方法一:暴力
class Solution { public: int countQuadruplets(vector<int>& nums) { int n=nums.size(); int res=0; for(int a=0;a<n-3;a++){ for(int b=a+1;b<n-2;b++){ for(int c=b+1;c<n-1;c++){ for(int d=c+1;d<n;d++){ if(nums[a]+nums[b]==nums[d]-nums[c]){ res++; } } } } } return res; } };
方法二:哈希表
通过i
将数组划分为两半,对分割线b
进行遍历
遍历的时候c=i+1
,但是由于map[nums[a]+nums[b]]++
是累计的,因此并不总是b、c粘和的情况。
class Solution { public: int countQuadruplets(vector<int>& nums) { int n=nums.size(); int res=0; unordered_map<int,int> map; for(int i=1;i<n-2;i++){ for(int j=0;j<i;j++){ map[nums[i]+nums[j]]++; } for(int j=i+2;j<n;j++){ if(map.count(nums[j]-nums[i+1])){ res+=map[nums[j]-nums[i+1]]; } } } return res; } };
可以通过这个连接进行理解,虽然它是从后向前遍历的