三数之和

此博客链接:https://www.cnblogs.com/ping2yingshi/p/14141757.html

三数之和

题目链接:https://leetcode-cn.com/problems/3sum/ 。

题目

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

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

 

示例:

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

满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]

题解

思路

先对数组排序,然后从头开始取数组的元素当成第一个数,然后使用双指针来记录另外两个元素的值,判断三个数的和是否为0.

方法

1.排序

2.遍历数组

3.找边界条件(当第一个数大于0时,后面相加就不可能为0,如果三数之和比0小,说明需要把左边的数向右移动,如果三数之和比0大,则说明有变右边的数需要向左移动)

4.注意:去重。这里的去重需要对三个数都进行去重。

 

代码

 


class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        Arrays.sort(nums);
        List<List<Integer>> result = new ArrayList();
        for(int i=0;i<nums.length;i++){
            int l=i+1;
            int r=nums.length-1;
            if(nums[i]>0)
                break;
            if(i==0||(nums[i]!=nums[i-1])){
               while(l<r){
                   if(nums[r]+nums[l]+nums[i]==0) 
                   {
                       result.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(nums[r]+nums[l]+nums[i]<0)
                      l++;
                   else
                      r--;
               }
            }
        }
        return result;
    }
}

 

结果

 

posted @ 2020-12-16 00:00  萍2樱释  阅读(221)  评论(0编辑  收藏  举报