zoukankan      html  css  js  c++  java
  • leetcode算法-三数之和

    一、题目

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

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

    示例:

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

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

    二、解题思路

    1、新建集合

    2、应当判定的只要数组的长度小于三就直接返回空集合

    3、然后对数组进行排序(不进行排序是无序数组,遍历查找工作相当复杂,而且效率极低)

    4、遍历排好序的数组,外层for循环,内层双指针移动的方法,将外层循环的数和双指针指向的数相加,只要相同,就存入存值集合,之后指针分别向中间移动,要判断如果指针指向的前一个数和后一个数相同那么继续移动指针

    5、注意:外层只要遍历到了某个数大于0,那么就直接返回此时的存值集合(因为是排好序的集合,只要大于0了,后面怎么遍历都不会等于0)

    三、代码:

    public static void main(String[] args) {
        int[] arrays = new int[] {-2,0,1,1,2};
        System.out.println(getArraysSort(arrays));
        
    }
    public static List<List<Integer>> getArraysSort(int[] arrays) {
        List<List<Integer>> returnList = new ArrayList<List<Integer>>();
        // 获取数组长度
        int length = arrays.length;
        if(length < 3) {
            return returnList;
        }
        // 数组排序
        Arrays.sort(arrays);
        // 采用指针进行遍历,找值
        for(int i = 0;i < length;i++) {
            // 判断剩余的数是否都为正数
            if(arrays[i] > 0) {
                return returnList;
            }
            // 判断数字是否重复
            if(i > 0 && arrays[i] == arrays[i - 1]) {
                continue;
            }
            int left = i + 1;
            int right = length - 1;
            while(left < right) {
                int temp = arrays[i] + arrays[left] + arrays[right];
                if(temp == 0) {
                    List<Integer> list = new ArrayList<Integer>();
                    list.add(arrays[i]);
                    list.add(arrays[left]);
                    list.add(arrays[right]);
                    returnList.add(list);
                    left++;
                    right--;
                    while(left < right && arrays[left] == arrays[left - 1]){
                            left++;
                        }
                    while(left < right && arrays[right] == arrays[right + 1]){
                            right--;
                           }
                    continue;
                }else if(temp < 0) {
                    left++;
                    continue;
                }else {
                    right--;
                    continue;
                }
                
            }
        }
        
        return returnList;
    }
  • 相关阅读:
    提高 github.com 项目下载速度
    理解git 中的HEAD指针&branch指针
    Docker Compose 配置文件详解
    Yarn 配置阿里源
    Laravel
    reCAPTCHA打不开的解决方法
    CC2 条理分明-----独立思考
    CC2 条理分明-----AACTP教你谈恋爱
    CC4 表达方式----输赢
    lambda匿名函数透析
  • 原文地址:https://www.cnblogs.com/mcjhcnblogs/p/13121892.html
Copyright © 2011-2022 走看看