前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【每日leetcode】19.三数之和

【每日leetcode】19.三数之和

作者头像
一条coding
发布2021-08-12 10:36:57
3060
发布2021-08-12 10:36:57
举报
文章被收录于专栏:一条IT

一题二写,三数之和,题解四瞅五瞄六瞧,水平还七上八下九流,十分辣鸡。 ——leetcode此题热评

前言

哈喽,大家好,我是一条。

糊涂算法,难得糊涂

现在遇题就想「动态规划」和「双指针」

Question

15. 三数之和

难度:中等

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

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

示例 1:

代码语言:javascript
复制
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]

示例 2:

代码语言:javascript
复制
输入:nums = []
输出:[]

示例 3:

代码语言:javascript
复制
输入:nums = [0]
输出:[]

提示:

代码语言:javascript
复制
0 <= nums.length <= 3000
-105 <= nums[i] <= 105

Solution

在这之前,我们做过两数之和。根据动态规划的思想,将问题拆解成一个数与另两个数的和互为相反数。 再利用双指针,计算另两数之和。 为了不得到重复解,先对数组进行排序。

  • 首先对数组按升序进行排序,排序后固定一个数 ,再使用左右指针指向该数后面的两端,计算三个数的和是否为 0,满足则添加进结果集
  • 考虑几种可能有重复解的情况
  • 对于重复元素:跳过,避免出现重复解 等于0时,判断边界是否和下一个值重复,去除重复解

Code

所有leetcode代码已同步至github 欢迎star

代码语言:javascript
复制
/**
 * @author yitiaoIT
 */

class Solution {
    public static List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> ans = new ArrayList();
        int len = nums.length;
        if(nums == null || len < 3) return ans;
        Arrays.sort(nums); // 排序
        for (int i = 0; i < len ; i++) {
            if(nums[i] > 0) break; // 如果当前数字大于0,则三数之和一定大于0,所以结束循环
            if(i > 0 && nums[i] == nums[i-1]) continue; // 去重
            int L = i+1;
            int R = len-1;
            while(L < R){
                int sum = nums[i] + nums[L] + nums[R];
                if(sum == 0){
                    ans.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 if (sum > 0) R--;
            }
        }        
        return ans;
    }
}

Result

复杂度分析

  • 时间复杂度:O(N)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一条coding 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • Question
    • 15. 三数之和
    • Solution
    • Code
    • Result
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档