三数之和

Posted cocobear9

tags:

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

给你一个包含 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;

    }

}

技术图片

 

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

最接近的三数之和--力扣

数组练习题:两数之和三数之和四数之和

LeetCode 16. 最接近的三数之和

15. 三数之和

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

LeetCode 15. 三数之和