每日一题:四数之和||

55 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第19天,点击查看活动详情

力扣题目链接

题目要求

给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):

  • 0 <= a, b, c, d < n
  • abc 和 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进行比对

这样就会有三种情况:

  1. HashMap存一组数据,如A,再计算另外三个数组之和,如BCD。总时间复杂度就会是O(n)+O(n^3) = O(n^3)
  2. HashMap存两组数据,如AB,再计算另外两个数组之和,如BC。总时间复杂度就会是O(n^2)+O(n^2) = O(n^2)
  3. HashMap存三组数据,如ABC,再计算另外一个数组,如D。总时间复杂度就会是O(n^3) + O(n) = O(n^3)

由上面的例子可以看出,用HashMap两组数据,再计算另外两个数组之和,总的时间复杂度最低

所以我们就采用第二种情况

具体步骤:

  1. 先定义一个HashMapab两数之和放进key里,两数之和出现的次数放在value
  2. 遍历第一个和第二个数组,统计两个数组的元素的和,和出现的次数,都放进map
  3. 定义一个int变量count,用来统计a + b + c + d == 0出现的次数
  4. 遍历第三个和第四个数组,如果找出 0 - ( c + d )在map出现的话,就用countmap里的key对应的value也就是出现次数给统计出来
  5. 返回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)

提交结果

image.png