力扣:18.四数之和

一、做题链接:18. 四数之和 - 力扣(LeetCode)

二、题目分析

1.做这一道题之前本博主建议先看上一篇《三数之和》

2.题目分析

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

由题可知:做这个题要主要面临的困难是去重和漏选,去重主要利用的是排序,set等,漏选就枚举

示例解析1,0,-1,0,-2,2->排序后-2,-1,0,0,1,2

以此类推得出最终答案

三、算法分析

1.暴力枚举法:排序+四层for循环+set去重;时间复杂度O(n^4)-----》这个不可跑过力扣

2.双指针+单调性+两层for循环;时间复杂度O(n^3)-》利用率三数之和--》利用率两数之和

算法步骤:

1.排序

2.设置第一个固定数

3.设置第二个固定数

4.两数之和,设置两个指针left,right-》降低复杂度的关键

5.细节处理,重点关注去重问题

注意事项:

去重:1.去除第一固定数的重如:0,0,求出来的一样

2.去除第二个数的重如:第一固定数是-1,第二固定数:0,0结果一样

3.去除两数之和的重

四、代码编写

java 复制代码
 public List<List<Integer>> fourSum(int[] nums, int target) {
        Arrays.sort(nums);//排序
        List<List<Integer>> Foursum = new ArrayList<>();
        for (int i = 0; i < nums.length; )//固定一个数
        {
            for (int j = i + 1; j < nums.length;)//固定第二个数
            {

                long tar = (long) target - nums[i] - nums[j];//求出两数之和的目标
                List<Integer> list = new ArrayList<>();
                //两数之和
                int left = j + 1;
                int right = nums.length - 1;
                while (left < right) {
                    if (left < nums.length && nums[left] + nums[right] < tar) {
                        left++;
                    } else if (right > 0 && nums[left] + nums[right] > tar) {
                        right--;
                    } else {
                        list.add(nums[i]);
                        list.add(nums[j]);
                        list.add(nums[left]);
                        list.add(nums[right]);
                        Foursum.add(list);
                        //去除第三重
                        while (left < nums.length && nums[left] == list.get(2)) {
                            left++;
                        }
                        while (right > 0 && nums[right] == list.get(3)) {
                            right--;
                        }
                    }
                }
                //去除第二重
                j++;
                while (j < nums.length && nums[j] == nums[j - 1]) {
                    j++;
                }
            }
            //去除第三重
            i++;
            while (i<nums.length && nums[i]==nums[i-1])
            {
                i++;
            }
        }
        return Foursum;
    }

你学废了吗

相关推荐
罗湖老棍子1 小时前
C Looooops(信息学奥赛一本通- P1640)
算法·数论·同余·裴蜀定理·扩展欧几里得
飘尘3 小时前
从"算子"到"AI Infra":大模型背后看不见的那群人在忙什么
人工智能·算法·面试
夏幻灵4 小时前
每日一题:LeetCode 3:无重复字符的最长子串——滑动窗口思路详解
算法·leetcode·职场和发展
CarIise4 小时前
Java实训阶段查漏补缺复习笔记2
java·linux·算法
无忧.芙桃4 小时前
C++ 并查集详解:原理、实现与应用
c语言·c++·算法·leetcode
蛋蛋的就会顺顺的5 小时前
hot100——二叉树
java·数据结构·算法·leetcode·力扣
Code_Solitude5 小时前
c语言:二分法的完整补充
c语言·开发语言·算法
一切皆是因缘际会5 小时前
掌控信息论:同源星际通信基础理论
人工智能·算法·ai
动词ing7 小时前
【C语言题目练习】算法 整数反转
c语言·开发语言·算法
Nil2087 小时前
leetcode 55跳跃游戏
算法·leetcode·游戏