leetcode算法题-数组-三数之和

题目描述

给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组
注意:答案中不可以包含重复的三元组。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/3sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

代码实现

package com.zcl.数组;

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

/**
 * Author:markusZhang
 * VM Args:
 * Date:Create in 2020/2/1 15:09
 */
public class 三数之和 {
    /*
    这个题比较难理解一点了,我逐行解释一下
    */
    public List<List<Integer>> threeSum(int[] nums) {
        //声明一个题目要求返回类型的集合
        List<List<Integer>> aList = new ArrayList<>();
        //先对数组进行一次排序,然后再采用双指针的思想
        Arrays.sort(nums);
        //对数组进行遍历,以i为基准作为第一个数的索引
        for(int i=0;i<nums.length-2;i++){
            //因为这本来就是一个排序数组了,如果第一个数值就大于0,那就没有遍历的必要了
            if(nums[i]>0){
                break;
            }
            //这是为了防止在前一个元素已经与当前元素后面的元素达成等于0的条件被放入集合中
            // ,听着有点绕口,就是去重,你细品
            if(i>0 && nums[i]==nums[i-1]){
                continue;
            }
            //这里就开始采用双指针算法思想了,不懂双指针的可以去看下双指针算法思想。
            int L = i+1;
            int R = nums.length-1;
            while(L<R){
                int sum = nums[i]+nums[L]+nums[R];
                if(sum==0){
                    aList.add(Arrays.asList(nums[i],nums[L],nums[R]));
                    //这块应该注意一下,为了除去相同元素,而进行的。防止出现相同序列被加入到集合中去。去重
                    while(L<R && nums[L]==nums[L+1]){
                        L++;
                    }
                    while(L<R && nums[R]==nums[R-1]){
                        R--;
                    }
                    L++;
                    R--;
                }else if(sum<0){
                    L++;
                }else{
                    R--;
                }
            }
        }
        return aList;
    }

    public static void main(String[] args) {
        int numbers[] = {-1, 0, 1, 2, -1, -4};
        List list = new 三数之和().threeSum(numbers);
        System.out.println(list.size());
        Iterator iterator = list.iterator();
        while(iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
}

猜你喜欢

转载自blog.csdn.net/MarkusZhang/article/details/104134968