代码随想录 哈希表-08-四数之和

18.四数之和

18. 四数之和

中等

给你一个由 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

和前面的三数之和一样的,都是用双指针来解答,多一层循环

class Solution {
    public List> fourSum(int[] nums, int target) {
        // 创建一个列表用于存储结果
        List> list = new ArrayList<>();
        // 对数组进行排序
        Arrays.sort(nums);
        // 遍历数组
        for (int a = 0; a < nums.length; a++) {
            // 如果当前元素与前一个元素相同,则跳过
            if (a > 0 && nums[a] == nums[a - 1]) {
                continue;
            }
            // 遍历数组的剩余部分
            for (int b = a + 1; b < nums.length; b++) {
                // 如果当前元素与前一个元素相同,则跳过
                if (b > a + 1 && nums[b] == nums[b - 1]) {
                    continue;
                }
                // 遍历数组的剩余部分
                for (int c = b + 1; c < nums.length; c++) {
                    // 如果当前元素与前一个元素相同,则跳过
                    if (c > b + 1 && nums[c] == nums[c - 1]) {
                        continue;
                    }
                    // 初始化指针d为数组的最后一个元素的索引
                    int d = nums.length - 1;
                    // 当c小于d时,执行循环
                    while (c < d) {
                        // 计算四个元素的和
                        long sum = (long) nums[a] + nums[b] + nums[c] + nums[d];
                        // 如果和大于目标值,则将指针d向左移动一位
                        if (sum > target) {
                            d--;
                        } else {
                            // 如果和小于等于目标值,则跳出循环
                            break;
                        }
                    }
                    // 如果c等于d,说明没有找到满足条件的四个元素,跳出循环
                    if (c == d) {
                        break;
                    }
                    // 如果四个元素的和等于目标值,将这四个元素添加到结果列表中
                    if (nums[a] + nums[b] + nums[c] + nums[d] == target) {
                        list.add(Arrays.asList(nums[a], nums[b], nums[c], nums[d]));
                    }
                }
            }
        }
        // 返回结果列表
        return list;
    }
}

你可能感兴趣的:(代码随想录,散列表,算法,数据结构)