15.三数之和

Posted yh-simon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了15.三数之和相关的知识,希望对你有一定的参考价值。

技术图片

暴力题解

思路

  • 确定两端值 a c,找出符合要求的中间值 b

代码

//超时
public static List<List<Integer>> threeSum(int[] nums) {
    List<List<Integer>> lists = new ArrayList<>();
    if (nums == null || nums.length < 3) return lists;
    Arrays.sort(nums);
    for (int i = 0; i < nums.length - 2; i++) {
        if (nums[i] > 0) break;
        for (int j = i + 2; j < nums.length; j++) {
            int tmp = -nums[i] - nums[j];
            for (int k = i + 1; k < j; k++) {
                if (nums[k] == tmp) {
                    List<Integer> list = new ArrayList<>();
                    list.add(nums[i]);
                    list.add(nums[k]);
                    list.add(nums[j]);
                    if (lists.contains(list)) {
                        continue;
                    }
                    lists.add(list);
                }
            }
        }
    }
    System.out.println(lists.toString());
    return lists;
}

双指针

思路

技术图片

代码

//22ms
public static List<List<Integer>> threeSum2(int[] nums) {
    List<List<Integer>> lists = new ArrayList<>();
    if (nums == null || nums.length < 3) return lists;
    int len = nums.length;
    Arrays.sort(nums);
    for (int i = 0; i < len - 2; i++) {
        if (nums[i] > 0) break;//当前数大于0,则三个数之和必大于0  终止遍历
        if (i > 0 && nums[i] == nums[i - 1]) continue;//去重
        int l = i + 1;
        int r = len - 1;
        while (l < r) {
            int sum = nums[i] + nums[l] + nums[r];
            if (sum == 0) {
                lists.add(Arrays.asList(nums[i], nums[l], nums[r]));
                while (l < r && nums[l] == nums[l + 1]) l++;//去重
                while (l < r && nums[r] == nums[r - 1]) r--;//去重
                l++;
                r--;
            } else if (sum < 0) l++;
            else r--;
        }
    }
    //System.out.println(lists.toString());
    return lists;
}

参考链接

灵魂画手:画解算法

以上是关于15.三数之和的主要内容,如果未能解决你的问题,请参考以下文章

15. 三数之和

LeetCode 15. 三数之和

15.三数之和

代码随想录算法训练营第7天 | ● 454.四数相加II ● 383. 赎金信 ● 15. 三数之和 ● 18. 四数之和 ● 总结

15.三数之和

代码随想录算法训练营第七天 | 454.四数相加II ,383. 赎金信 ,15. 三数之和,18. 四数之和