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;
}

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2024 CODEPRJ.COM