持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第19天,点击查看活动详情
题目要求
给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):
0 <= a, b, c, d < na、b、c和d互不相同nums[a] + nums[b] + nums[c] + nums[d] == target
你可以按 任意顺序 返回答案 。
示例 1:
输入: nums = [1,0,-1,0,-2,2], target = 0
输出: [[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]
示例 2:
输入: nums = [2,2,2,2,2], target = 8
输出: [[2,2,2,2]]
提示:
1 <= nums.length <= 200-109 <= nums[i] <= 109-109 <= target <= 109
解题思路: (哈希表)
这道题要我们在数组中频繁的检查元素,所以我们可以使用哈希表来做题
我们用HashMap来实现,HashMap存一组,另一组和HashMap进行比对
这样就会有三种情况:
HashMap存一组数据,如A,再计算另外三个数组之和,如BCD。总时间复杂度就会是O(n)+O(n^3) = O(n^3)HashMap存两组数据,如AB,再计算另外两个数组之和,如BC。总时间复杂度就会是O(n^2)+O(n^2) = O(n^2)HashMap存三组数据,如ABC,再计算另外一个数组,如D。总时间复杂度就会是O(n^3) + O(n) = O(n^3)
由上面的例子可以看出,用HashMap存两组数据,再计算另外两个数组之和,总的时间复杂度最低
所以我们就采用第二种情况
具体步骤:
- 先定义一个
HashMap,a和b的两数之和放进key里,两数之和出现的次数放在value里 - 遍历第一个和第二个数组,统计两个数组的元素的和,和出现的次数,都放进
map里 - 定义一个
int变量count,用来统计a + b + c + d == 0出现的次数 - 遍历第三个和第四个数组,如果找出
0 - ( c + d )在map出现的话,就用count把map里的key对应的value也就是出现次数给统计出来 - 返回
count
代码:(Java实现)
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
定义HashMap
HashMap<Integer,Integer> map = new HashMap<>();
for (int i : nums1) {
for (int j : nums2) {
int temp = i + j;
if (map.containsKey(temp)) {
map.put(temp,map.get(temp)+1);
}else {
map.put(temp,1);
}
}
}
int count = 0;
for (int i : nums3) {
for (int j : nums4) {
int temp = i + j;
if (map.containsKey(0 - temp)) {
count += map.get(0 - temp);
}
}
}
return count;
}
复杂度分析
- 时间复杂度:O(n^2)
- 空间复杂度:O(1)