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;
    }
  • 相关阅读:
    spring-framework-x.x.x.RELEASE-dist下载教程
    SpringMVC——SpringMVC简介
    SSM框架报错分析(一)——There is no getter for property named 'XXX' in 'class java.lang.String'
    mysql一次查询,返回多个统计结果
    Mybatis进阶学习笔记——关系查询——一对多查询
    Mybatis进阶学习笔记——关系查询——一对一查询
    Mybatis进阶学习笔记——动态sql
    Mybatis进阶学习笔记——输出映射
    C#语言概述
    第一个C#程序Hello World
  • 原文地址:https://www.cnblogs.com/mcjhcnblogs/p/13121892.html
Copyright © 2011-2022 走看看