LeetCode:三数之和

225 阅读1分钟

一、三数之和

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。 注意: 答案中不可以包含重复的三元组。

输入: nums = [-1,0,1,2,-1,-4]
输出: [[-1,-1,2],[-1,0,1]]

二、排序+暴力解法

时间复杂度近 O(N3)O(N^3) 不予尝试

三、排序+双指针

package cn.edu.neu.leetcode;

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

/**
 * @author 
 *
 * 三数之和为0
 *
 */
public class ThreeNumSumIsZero {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> ans = new ArrayList<>();
        // 数组长度
        int n = nums.length;
        // 排序:调用Arrays工具类的排序方法
        Arrays.sort(nums);
        // 遍历 a
        for(int i=0; i<n; i++){
            if(nums[i]>=0){
                return ans;
            }

            // 需要和上一次枚举的数不相同
            if (i > 0 && nums[i] == nums[i - 1]) {
                continue;
            }

            // b+c=-a
            int target = -nums[i];
            // c 对应的指针指向最右端
            int k = n-1;
            // b>a
            for(int j = i+1; j<n; j++){
                if(j>i+1 && nums[j]==nums[j-1]){continue;}
                // c 指针一致大于 b指针
                while (j<k && nums[j]+nums[k]>target){
                    --k;
                }
                // 如果指针重合,j继续增加,但是不会有满足 a+b+c=0 且 b<c 的 c 值,退出循环
                if(j==k){
                    break;
                }
                if(nums[j]+nums[k]==target){
                    List<Integer> list = new ArrayList<Integer>();
                    list.add(nums[i]);
                    list.add(nums[j]);
                    list.add(nums[k]);
                    ans.add(list);
                }
            }
        }
        return ans;
    }

    public static void main(String[] args) {

    }
}

image.png