首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >每天一道leetcode15-三数之和

每天一道leetcode15-三数之和

作者头像
乔戈里
发布2019-09-17 14:55:15
2360
发布2019-09-17 14:55:15
举报
文章被收录于专栏:Java那些事Java那些事

昨天的题解

题目

每天一道leetcode15-三数之和 分类:数组 中文链接: https://leetcode-cn.com/problems/3sum/submissions/ 英文链接 https://leetcode.com/problems/3sum/submissions/

题目详述

给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。 注意:答案中不可以包含重复的三元组。 例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4], 满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ]

题目详解

思路

  • 这个题目和昨天的挺像的,就在昨天的代码改了改就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--。
class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        HashSet<List<Integer>> set = new HashSet<>();
        List<List<Integer>> result = new ArrayList<>();
        int target = 0;
        if(nums.length == 3)
        {
            if(nums[0] + nums[1] + nums[2] == 0)
            {
                List<Integer> temp = new ArrayList<>();
                temp.add(nums[0]);
                temp.add(nums[1]);
                temp.add(nums[2]);
                result.add(temp);
                return result;
            }
            return result;
        }
        Arrays.sort(nums);
        for(int one=0;one < nums.length-2;one++)
        {
            int left = one + 1;
            int right = nums.length - 1;
            while(left < right)
            {
                int tempSum = nums[one] + nums[left] + nums[right];
                if(tempSum == 0 )
                {
                    List<Integer> temp = new ArrayList<>();
                    temp.add(nums[one]);
                    temp.add(nums[left]);
                    temp.add(nums[right]);
                    set.add(temp);
                }
                if(tempSum < target)
                {
                    left++;
                }else{
                    right--;
                }
            }   
        }
        for(List<Integer> t : set)
        {
            result.add(t);
        }
        return result;
    }
}

代码讲解

  • 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,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员乔戈里 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 昨天的题解
    • 题目
      • 题目详述
        • 题目详解
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档