LeetCode 15.三数之和

题目:

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。

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

示例 1:

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
解释:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
注意,输出的顺序和三元组的顺序并不重要。

示例 2:

输入:nums = [0,1,1]
输出:[]
解释:唯一可能的三元组和不为 0 。

思路:

  • 排序+ 双指针。双指针,一个从小到大,一个从大到小。
  • 数据的下标不能重复。
  • 三重循环。对于每一重循环而言,相邻两次枚举的元素不能相同,否则也会造成重复。

代码:

class Solution {

    public List<List<Integer>> threeSum(int[] nums) {
        int n = nums.length;
        //排序
        Arrays.sort(nums);
        List<List<Integer>> ansList = new ArrayList<>();
        //枚举第一个数
        for (int first = 0; first < n; first++) {
        	//相邻两次枚举的元素不能相同,否则也会造成重复。
            //需要和上一次枚举的数不相同。first如果等于0,那first-1为 -1,明显不对。
            if ( first> 0 && nums[first] == nums[first-1]) {
                continue;
            }

            //枚举第二个数.注意:这里是 second = first+1
            for (int second = first+1 ; second< n; second++) {
                //需要和上一次枚举的数不相同.
                if (second > first+1 && nums[second] == nums[second-1]) {
                    continue;
                }                
                //c对应的指针初始指向数组的最右端
                int third = n -1;
                //要保证 b的指针在 c的指针左侧
                //注意:第三个数是从大到小逐渐变化的
                while (second < third && nums[second]+ nums[third]+nums[first] > 0  ) {
                    --third;
                }
                //如果指针重合,随着b后续的增加
                //就不会有满足 a+b+c =0 并且 b< c,可以退出循环.
                //注意:这里是容易遗漏的地方
                if (second == third) {
                    break;
                }
                if (nums[second] + nums[third]+ nums[first] == 0) {
                    List<Integer> list = new ArrayList<>();
                    list.add( nums[first]);
                    list.add( nums[second]);
                    list.add( nums[third]);
                    ansList.add( list);
                }

            }
        }

        return ansList;

    }

}

posted on   乐之者v  阅读(6)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
历史上的今天:
2024-02-22 电商业务知识总结(三)--退货退款
2024-02-22 电商业务知识总结(二)--订单和支付
2024-02-22 电商业务知识总结(一)
2023-02-22 Git分支和迭代流程
2023-02-22 审批流程的设计
2021-02-22 ElastaticSearch--- es多字段聚合
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示