程序员文章、书籍推荐和程序员创业信息与资源分享平台

网站首页 > 技术文章 正文

09.算法学习之三数之和(编程求三数之和)

hfteth 2025-07-21 14:04:46 技术文章 1 ℃

题目:给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。

注意:答案中不可以包含重复的三元组。

示例


给定数组 nums = [-1, 0, 1, 2, -1, -4],

满足要求的三元组集合为:

[

[-1, 0, 1],

[-1, -1, 2]

]



我的思路: 三数之和,这个题是我们之前做的《两数之和》的进阶版本,难度更大。这题用暴力破解肯定是时间超时的,时间复杂度为O(n3),同时我们还要注意题目的要求,要找出不重复的三元组,这要求更是增加了题目的难度。那么,我们的思考一下用其他的方法。 借鉴一下《两数之和》双指针是一个可以用到的技巧。 那么如何处理重复呢? 在这里想了很久,借鉴了大表哥的思路,先把数组排序,能起到一个很好的作用。 比如第一层for循环我们排序后的数值是 1,1,2,3 那么这两个1,我们其实可以跳过一个,因为1如果找到三元组,那么第二个1也会重复找到一样的,所以我们就可以直接跳过。

总结上述: 1.双指针 2:数组先排序,重复数值可以跳过。

代码如下:

public static List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> list = new ArrayList<>();
        if (nums == null || nums.length < 1) {
            return list;
        }
        Arrays.sort(nums);
        for (int i = 0; i < nums.length; i++) {
            int n = nums[i];
            if (n > 0) {
                break;
            }
            //去重
            if (i > 0 && nums[i] == nums[i - 1]) {
                continue;
            }
            int start = i + 1;
            int end = nums.length - 1;
            while (start < end) {
                int sum = n + nums[start] + nums[end];
                if (sum > 0) {
                    end--;
                } else if (sum < 0) {
                    start++;
                } else {
                    List<Integer> l = new ArrayList<>();
                    l.add(n);
                    l.add(nums[start]);
                    l.add(nums[end]);
                    list.add(l);
                    //排好序后,进行组合去重
                    while (start < end && nums[start] == nums[start + 1]) start++;
                    while (start < end && nums[end] == nums[end - 1]) end--;
                    //比较下一位
                    start++;
                    end--;
                }
            }
        }
        return list;
    }


这个题目对于我来说还是很有难度的,参考了各位大表哥的思路之后,才能写出题解。努力思考,继续加油!

如有错误,请各位大佬指出,谢谢!

Tags:

最近发表
标签列表