码迷,mamicode.com
首页 > 其他好文 > 详细

三数之和

时间:2020-06-12 20:03:59      阅读:82      评论:0      收藏:0      [点我收藏+]

标签:pac   string   add   ret   length   stat   经典   tin   双指针   

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

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

 

示例:

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

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

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

写在前面:萌新我还是有点菜的一TNT,本题与 1. 两数之和 类似,是非常经典的面试题,但是做法不尽相同。

这里使用的排序+双指针的方法https://www.bilibili.com/video/BV1LZ4y1W7DD?from=search&seid=8972013113548898136小姐姐NB!

package aboutArray;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class ThreeSum {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[] nums= {-2,0,1,1,2};
        List<List<Integer>> list = threeSum(nums);
        for(List<Integer> l:list) {
            System.out.println(l);
        }
    }
    public static List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> res =  new ArrayList<>();
        Arrays.sort(nums);//排序
        int n =nums.length;
        for(int i=0;i<n-2;i++) {
            //第一个数nums[i]也要去重
            if(i>0 && nums[i]==nums[i-1]) {
                continue ;
            }
            int target =0-nums[i];
            int start =i+1;
            int end =n-1;
            while(start<end) {
                int sum=nums[start]+nums[end];
                if(sum == target) {
                    //注意这里两数之和相等,对应的start和end指针已经对应的自增和自减了
                    res.add(Arrays.asList(nums[i],nums[start++],nums[end--]));
                    //内部双指针需要去重由于start已经自增一次了,所以start应该和上一次比较start-1
                    while(start<end&&nums[start]==nums[start-1]) {
                        start++;
                    }
                    //由于end已经自减一次了,所以end应该和上一次比较end+1
                    while(start<end && nums[end]==nums[end+1]) {
                        end--;
                    }
                }
                else if(sum>target) {
                    //和大于目标值,那么要让和减少一点end--
                    end--;
                }
                else {
                    //同理
                    start++;
                }
            }
        }
        return res;

    }

}

技术图片

 

三数之和

标签:pac   string   add   ret   length   stat   经典   tin   双指针   

原文地址:https://www.cnblogs.com/cocobear9/p/13109800.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!