每天一道leetcode15-三数之和

LeetCode 15题解析:三数之和
本文详细解析了LeetCode上的经典题目“三数之和”,介绍了如何通过排序和双指针技巧寻找数组中三个数的组合,使它们的和为零。文章提供了完整的代码实现及讲解,帮助读者理解算法思路。

考试结束,班级平均分只拿到了年级第二,班主任于是问道:大家都知道世界第一高峰珠穆朗玛峰,有人知道世界第二高峰是什么吗?正当班主任要继续发话,只听到角落默默想起来一个声音:”乔戈里峰”

前言

2018.11.19号打卡今天的题目leetcode18:

昨天的题解

题目

每天一道leetcode15-三数之和

题目详述

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

题目详解

思路

  • 这个题目和昨天的挺像的,就在昨天的代码改了改就AC了

  • 先sort一下array,为啥要sort呢,因为要用到two pointers 来遍历找两数之和,只有在从小到大排序之后的结果上,才能根据情况移动left 和right。

  • 首先是如果数组只有3个数字,那么直接返回这三个数字之和;(最少三个数)

  • 当确定好了第一个数字后,就在剩下的array里找两数之和,在加上第一个数字,得到tempSum,比较这个tempSum是不是等于0,如果是0,则把这个结果保存下来(这里注意先把结果存到hashSet里面,去重)

  • 之后如果tempSum与0不相等 利用two pointers 特性, 如果tempSum 比0 小的话,说明我们需要更大的sum,所以要让left++以便得到更大的sum。 如果tempSum 比0 大的话,我们就需要更小的sum,所以right--。

 1class Solution {
 2    public List<List<Integer>> threeSum(int[] nums) {
 3        HashSet<List<Integer>> set = new HashSet<>();
 4        List<List<Integer>> result = new ArrayList<>();
 5        int target = 0;
 6        if(nums.length == 3)
 7        {
 8            if(nums[0] + nums[1] + nums[2] == 0)
 9            {
10                List<Integer> temp = new ArrayList<>();
11                temp.add(nums[0]);
12                temp.add(nums[1]);
13                temp.add(nums[2]);
14                result.add(temp);
15                return result;
16            }
17            return result;
18        }
19        Arrays.sort(nums);
20        for(int one=0;one < nums.length-2;one++)
21        {
22            int left = one + 1;
23            int right = nums.length - 1;
24            while(left < right)
25            {
26                int tempSum = nums[one] + nums[left] + nums[right];
27                if(tempSum == 0 )
28                {
29                    List<Integer> temp = new ArrayList<>();
30                    temp.add(nums[one]);
31                    temp.add(nums[left]);
32                    temp.add(nums[right]);
33                    set.add(temp);
34                }
35                if(tempSum < target)
36                {
37                    left++;
38                }else{
39                    right--;
40                }
41            }   
42        }
43        for(List<Integer> t : set)
44        {
45            result.add(t);
46        }
47        return result;
48    }
49}

代码讲解

  • 6-18行就是如果数组长度是3,那么直接判断数组和是不是0,如果是0则返回这个,不是返回kong

  • 19行对nums进行排序

  • 20-42行中第20行就是从首先确定一个数,22-23行就是从确定的数的下一个left+1到数组的长度-1这个范围内找出这两个数。

  • 26-34行就是判断这三个数的和tempSum是不是0,如果是0那么就填入到hashset中

  • 35-40行就是之后如果tempSum与0不相等 利用two pointers 特性, 如果tempSum 比0 小的话,说明我们需要更大的sum,所以要让left++以便得到更大的sum。 如果tempSum 比0 大的话,我们就需要更小的sum,所以right--。

  • 43-46行 遍历这个set然后加入到List中,把它返回。

结束语

2018.11.19号打卡

关于本号

作者乔戈里亲历2019秋招,哈工大计算机本硕,百度java工程师,欢迎大家关注我的微信公众号:程序员乔戈里,公众号有3T编程资源,以及我和我朋友(百度C++工程师)在秋招期间整理的近200M的面试必考的java与C++面经,并有每天一道leetcode打卡群与技术交流群,欢迎关注。

640?wx_fmt=png

3T编程资料等你来拿

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值