【刷题记录】18. 四数之和

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述

来源:力扣(LeetCode)

给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。

请你找出并返回满足下述全部条件且不重复的四元组  [nums[a], nums[b], nums[c], nums[d]] 
(若两个四元组元素一一对应,则认为两个四元组重复):

  • 0 <= a, b, c, d < n
  • a、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

二丶思路分析

排序 + 双指针

这个题目 和 【刷题记录】15.三数之和 的思路是一样的,只不过是从三个数,变成了四个数字的处理。

  • 定义 四个 指针 i,j,L,R
  • 在确定两个数 i,j 的情况下,双指针L,R从两边遍历,查找。

三、代码实现

class Solution {
public List<List<Integer>> fourSum(int[] nums, int t) {
        Arrays.sort(nums);
        int n = nums.length;
        List<List<Integer>> res = new ArrayList<>();

        // 确定第一个数
        for (int i = 0; i < n; i++) {
            // 对第一个数进行去重
            if (i > 0 && nums[i] == nums[i - 1]) continue;
            // 确定第二个数
            for (int j = i + 1; j < n; j++) {
                // 对第二个数进行去重
                if (j > i + 1 && nums[j] == nums[j - 1]) continue; 
                // 确定第三个数和第四个数
                int L = j + 1;
                int R = n - 1;
                while (L < R) {

                    // 对第三个数进行去重
                    while (L > j + 1 && L < n && nums[L] == nums[L - 1]) L++;
                    if (L >= R) break;

                    int sum = nums[i] + nums[j] + nums[L] + nums[R];
                    if (sum == t) {
                        res.add(Arrays.asList(nums[i], nums[j], nums[L], nums[R]));
                        L++;
                    } else if (sum > t) {
                        R--;
                    } else {
                        L++;
                    }
                }
            }
        }
        return res;
    }
}
复制代码

复杂度分析

时间复杂度:O(n3)O(n^3),其中 n 是数组的长度。排序的时间复杂度是 O(nlogn)O(nlogn),枚举四元组的时间复杂度是 O(n3)O(n^3),因此总时间复杂度为 O(n3+nlogn)=O(n3)O(n^3+nlog n)=O(n^3)

空间复杂度:O(n)O(n),按照题目中 就是存储排序后的数组所占用。

运行结果

image.png

总结

这个题目是个以前做过题目的一个变形,从三元变成了四元,但是处理的思路是一样。只是处理的步骤会多一下。

所以这种题目,只要理解一个,一类的问题都能迎刃而解。继续加油~

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享