Leetcode刷题100天—15. 三数之和( 排序)—day30

Posted 神的孩子都在歌唱

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode刷题100天—15. 三数之和( 排序)—day30相关的知识,希望对你有一定的参考价值。

前言:

作者:神的孩子在歌唱

大家好,我叫运智

15. 三数之和

难度中等3716收藏分享切换为英文接收动态反馈

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

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

示例 1:

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]

示例 2:

输入:nums = []
输出:[]

示例 3:

输入:nums = [0]
输出:[]

提示:

  • 0 <= nums.length <= 3000
  • -105 <= nums[i] <= 105
package 排序;

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

public class _15_三数之和 {
    public List<List<Integer>> threeSum(int[] nums) {
//    	设定一个二维列表
    	List<List<Integer>> res=new ArrayList<List<Integer>>();
//    	排序
    	Arrays.sort(nums);
//    	初始化指针
    	int left=0;

//    	while循环直到左指针大于0结束
    	while(left<nums.length&&nums[left]<=0) {
//    		定义一个可以在左右指针中间遍历的指针
    		int pivot=left+1;
//    		定义右指针
            int right=nums.length-1;

//    		如果前一个数和后一个数相等那么跳过循环去除重复值
    		if (left>0&&nums[left]==nums[left-1]) {
    			left++;
				continue;
			}
//    		如果pivot等于right就结束循环
    		while(pivot<right) {
//    			如果有重复的数就退出
        		if (pivot>left+1&&nums[pivot]==nums[pivot-1]) {
					pivot++;
                    continue;
				}
//        		如果符合条件
        		else if (nums[left]+nums[pivot]+nums[right]==0) {
//    				将这三个数存入列表,在存入二维列表
        			res.add(new ArrayList<Integer>(Arrays.asList(nums[left],nums[pivot],nums[right])));
                    pivot++;
                    right--;
    			}
//        		否则如果大于num>0,说明右边的数太大right--
        		else if (nums[left]+nums[pivot]+nums[right]>0) {
    				right--;
    			}
//        		否则如果小于0,说明左边数太小pivot++
        		else {
    				pivot++;
    			}
    		}
//    		left加一继续判断
    		left++;

    	}
    	return res;
    }
    public static void main(String args[]) {
    	int[] nums= {-1,0,1,2,-1,-4};
    }
}
/*
 * 思路:[-1,0,1,2,-1,-4]
 * 排序sort:[-4,-1,-1,0,1,2]
 * 设定两个指针left 和 right在定义他们中间移动的数pivot
 * 如果left+pivot+right==0那么pivot=++,right--
 * 如果pivot==right结束循环,进行下一循环left++ pivot=left+1
 */

本人csdn博客:https://blog.csdn.net/weixin_46654114

转载说明:跟我说明,务必注明来源,附带本人博客连接。

以上是关于Leetcode刷题100天—15. 三数之和( 排序)—day30的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode刷题15-简单-三数之和

LeetCode刷题15-简单-三数之和

Leetcode刷题Python15. 三数之和

leetcode刷题21.三数之和——Java版

LeetCode刷题系列之-多数之和类型

LeetCode刷题系列之-多数之和类型