三数之和

三数之和

难度 中等

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

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

 

示例:

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

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

实现:

package com.mtons.mblog;


import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

class Solution {

    /**
     * 超出时间限制
     *
     * @param nums
     * @return
     */
    public List<List<Integer>> threeSum(int[] nums) {

        List<List<Integer>> resultList = new ArrayList<>();
        for (int i = 0; i < nums.length; i++) {
            for (int j = i + 1; j < nums.length; j++) {
                for (int k = j + 1; k < nums.length; k++) {

                    if (nums[i] + nums[j] + nums[k] == 0) {
                        List<Integer> list = new ArrayList<>();
                        list.add(nums[i]);
                        list.add(nums[j]);
                        list.add(nums[k]);
                        boolean flag = false;
                        for (List<Integer> integers : resultList) {
                            //有相等的
                            if (twoListCompareUtil(integers, list)) {
                                flag = true;
                                break;
                            }
                        }
                        if (!flag) {
                            resultList.add(list);
                        }
                    }

                }

            }
        }
        return resultList;
    }

    /**
     * @param firstList 第一个list参数
     * @param scList    第二个list参数
     * @return boolean  相等为true,否则为false
     */
    public static <T extends Comparable<T>> boolean twoListCompareUtil(List<T> firstList, List<T> scList) {
        //首先判断这两个list的大小是否相等
        if (firstList.size() != scList.size()) {
            return false;
        }
        //如果两个list大小相等,其中可能为0,所以排除为0的这种情况
        if (firstList.size() > 0 && scList.size() > 0) {
            //如果相等,对两个list分别排序以方便后期比较
            Collections.sort(firstList);
            Collections.sort(scList);
            //循环遍历两个几个取值比较是否相同,不同则返回false
            for (int i = 0; i < firstList.size(); i++) {
                //取值比较是否相同
                if (!firstList.get(i).equals(scList.get(i))) {
                    return false;
                }
            }
            return true;
        } else {
            return false;
        }

    }

    public static void main(String[] args) {
    }
}



满足时间复杂度的算法实现:

package com.mtons.mblog;


import java.util.*;

class Solution {

    /**
     * 夹逼法
     * 899 ms	45.9 MB
     *
     * @param nums
     * @return
     */
    public List<List<Integer>> threeSum(int[] nums) {
        //数量不满足a+b+c
        if (nums == null || nums.length <= 2) {
            return Collections.emptyList();
        }
        //去重结果集
        Set<List<Integer>> result = new LinkedHashSet<>();
        //快速排序
        Arrays.sort(nums);
        for (int i = 0; i < nums.length - 2; i++) {
            //第一个数 第二个数
            int head = i + 1;
            //最后一个数
            int tail = nums.length - 1;
            while (head < tail) {
                //a+b=-c   a+b+c=0  c=-(a+b)
                int sum = -(nums[head] + nums[tail]);
                if (sum == nums[i]) {
                    //几个数值存入list
                    List<Integer> value = Arrays.asList(nums[i], nums[head], nums[tail]);
                    //去重
                    result.add(value);
                }
                //
                if (sum <= nums[i]) {
                    tail--;
                } else {
                    head++;
                }
            }
        }
        //Set> result = new LinkedHashSet<>();
        //List>   set直接转list
        return new ArrayList<>(result);
    }

    public static void main(String[] args) {
        List<List<Integer>> lists = new Solution().threeSum(new int[]{-1, 0, 1, 2, -1, -4});
        System.out.println("");
    }
}



你可能感兴趣的:(三数之和)