美文网首页
18. 四数之和

18. 四数之和

作者: 名字是乱打的 | 来源:发表于2025-01-01 17:28 被阅读0次

一 题目

二 思路

  • 类似于三数循环,三数循环是外面一个for固定一值,剩下的数里找加和
    现在是两个for固定两个值,剩下的数里找加和

三代码:

 public List<List<Integer>> fourSum(int[] nums, int target) {
        List<List<Integer>> res = new LinkedList<>();
        if (nums.length<4 ||nums==null){
            return res;
        }

        Arrays.sort(nums);
        int length =nums.length;
        for (int i = 0; i <length-3; i++) {
            if (i > 0 && nums[i] == nums[i - 1]) {
                continue;
            }

            for (int j = i + 1; j <length-2; j++) {
                if (j > i + 1 && nums[j] == nums[j - 1]) {
                    continue;
                }

                //说明此时剩下的两个数无论取什么值,四数之和一定大于 target,因此退出第二重循环;
                if ((long) nums[i] + nums[j] + nums[j + 1] + nums[j + 2] > target) {
                    break;
                }
                //说明此时剩下的两个数无论取什么值,四数之和一定小于 target,因此第二重循环直接进入下一轮
                if ((long) nums[i] + nums[j] + nums[length - 2] + nums[length - 1] < target) {
                    continue;
                }

                //在后面的数里找到和为-nums[i]的数
                int l = j + 1;
                int r =length - 1;
                while (l < r) {
                    if (nums[l] + nums[r] == target - (nums[i] + nums[j])) {
                        res.add(Arrays.asList(nums[i], nums[j], nums[l], nums[r]));
                        // 特殊情况3 直接走到最后一个相同的数那里,避免多次循环
                        while (l + 1 <length && nums[l + 1] == nums[l]) {
                            l++;
                        }

                        while (r - 1 > 0 && nums[r - 1] == nums[r]) {
                            r--;
                        }

                        l++;
                        r--;
                    } else if (nums[l] + nums[r] > target-(nums[i] + nums[j])) {
                        r--;
                    } else if (nums[l] + nums[r] < target-(nums[i] + nums[j])) {
                        l++;
                    }
                }

            }
        }

        return res;
    }

相关文章

  • 【Leetcode算法题】18. 四数之和

    By Long Luo 18. 四数之和[https://leetcode-cn.com/problems/4su...

  • LeetCode-18 四数之和

    题目:18. 四数之和 难度:中等 分类:数组 解决方案:双指针 今天我们学习第18题四数之和,这是一道中等题。像...

  • 力扣每日一题:18.四数之和

    18.四数之和 https://leetcode-cn.com/problems/4sum/[https://le...

  • 18.四数之和

    18.四数之和 题目链接:https://leetcode-cn.com/problems/4sum/[https...

  • 18. 四数之和

    一、题目原型: 给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四...

  • 18. 四数之和

    知乎ID: 码蹄疾码蹄疾,毕业于哈尔滨工业大学。小米广告第三代广告引擎的设计者、开发者;负责小米应用商店、日历、开...

  • 18. 四数之和

    18.四数之和 给定一个包含n个整数的数组nums和一个目标值target,判断nums中是否存在四个元素a,b,...

  • 18.四数之和

    给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,...

  • 18. 四数之和

    一、题目 给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素...

  • 18.四数之和

    自己解法 四数之和解题思路和三数之和类似,不过这个方式是固定前两个数字,后面两个数字用夹逼的方式向中间逼近,这样时...

网友评论

      本文标题:18. 四数之和

      本文链接:https://www.haomeiwen.com/subject/ssaxyjtx.html