15-三数之和

@Author:CSU张扬
@Email:csuzhangyang@gmail.com or csuzhangyang@qq.com

Category Difficulty Pass rate Tags Companies
algorithms Medium 24.31% array / two-pointers adobe / amazon / bloomberg / facebook / microsoft

1. 题目

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

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

例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[[-1, 0, 1],[-1, -1, 2]
]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/3sum/

2. 解法

2.1 解法一:双指针法

  1. 首先对数组从大到小排序,数组的大小为 n
  2. 固定一个数,从其右侧的数中寻找另外两个数。
    假设我们固定的数为 nums[k], k = 0 to n-1 , 另外两个数初始时分别为 nums[l], nums[r] , 其中 l = k + 1, r = n - 1
  3. sum = nums[k] + nums[l] + nums[r]
    1. sum < 0 ,则我们要增大 sum ,此时只能对 l 向右挪一格,即:l ++
    2. sum > 0 ,则我们要减小 sum ,此时只能对 r 向左挪一格,即:r --
    3. sum == 0 ,此时这三个数就我们需要的数,将他们加入结果里。此时,lr 之间的数还可能有我们需要的数,我们此时需要左右都向内移动,即:l ++, r -- 。。
  4. 避免重复的数据。
    1. sum == 0 时,我们需要 lr 都向内移动。此时需要过滤掉和当前 nums[l], nums[r] 重复的数据,我们巧妙的使用了两个while循环,同时需注意 l 要一直小于 r
      while (l < r && nums[l] == nums[++ l]) { }
      while (l < r && nums[r] == nums[-- r]) { }
    2. 同时,我们也要在 k 的循环中过滤掉和当前 nums[k] 重复的数字。这里的 k < len - 2主要是防止数组越界。
      while (k < len - 2 && nums[k] == nums[++ k]) { }
  5. l >= r 时,说明与当前固定的 nums[k] 相组合的两个数已经找完,所以要进入下一个 nums[k]

执行用时: 112 ms, 在所有 cpp 提交中击败了98.73%的用户
内存消耗: 14.6 MB, 在所有 cpp 提交中击败了86.17%的用户

class Solution {public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> res;int len = nums.size();if (len < 3) {return res;}sort(nums.begin(), nums.end());int k = 0;while(k < len - 2 && nums[k] <= 0) {int l = k + 1;int r = len - 1;while (l < r) {int sum = nums[k] + nums[l] + nums[r];if (sum == 0) {res.push_back({nums[k], nums[l], nums[r]});while (l < r && nums[l] == nums[++ l]) { }while (l < r && nums[r] == nums[-- r]) { }}else if (sum < 0) {++ l;}else {-- r;}}while (k < len - 2 && nums[k] == nums[++ k]) { }}return res;}
};

LeetCode(C++)刷题计划:15-三数之和相关推荐

  1. LeetCode刷题笔记- 15.三数之和

    LeetCode刷题笔记- 15.三数之和 C语言 题目 注意点 C语言 /*** Return an array of arrays of size *returnSize.* The sizes ...

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

    ⭐欢迎订阅<leetcode>专栏,每日一题,每天进步⭐ 一题二写,三数之和,题解四瞅五瞄六瞧,水平还七上八下九流,十分辣鸡. --leetcode此题热评 前言 哈喽,大家好,我是一条. ...

  3. Leetcode题库 15.三数之和_0(双指针 C实现)

    第二次尝试结果:成功 第二次成果链接:三数之和 第一次尝试结果:失败 第一次过程如下 #include <stdio.h>void Bub_Sort(int* head, int low, ...

  4. Leetcode题库 15.三数之和_1(双指针 C实现)

    第二次尝试结果:成功 第二次过程如下 #include <stdio.h>void Bub_Sort(int* head, int low, int high, int Bool) {// ...

  5. Bia布刷题日记 LC-15 三数之和

    Leecode 540 有序数组中的单一元素 算法描述: 540.有序数组中的单一元素给你一个仅由整数组成的有序数组,其中每个元素都会出现两次,唯有一个数只会出现一次. 请你找出并返回只出现一次的那个 ...

  6. Leetcode python《热题 HOT 100》15. 三数之和

    Leetcode python 之 <热题 HOT 100>:https://leetcode-cn.com/problemset/hot-100/ 15. 三数之和 给定一个包含 n 个 ...

  7. leetcode每日刷题计划-简单篇day8

    leetcode每日刷题计划-简单篇day8 今天是纠结要不要新买手机的一天QAQ想了想还是算了吧,等自己赚钱买,加油 Num 70 爬楼梯 Climbing Stairs class Solutio ...

  8. LeetCode 15. 三数之和(3Sum)

    15. 三数之和 15. 3Sum 题目描述 Given an array nums of n integers, are there elements a, b, c in nums such th ...

  9. [双指针|模拟] leetcode 15 三数之和

    [双指针|模拟] leetcode 15 三数之和 1.题目 题目链接 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ? ...

最新文章

  1. python27-python27安装
  2. 路径调度问题(CVRP)后续之如何在MATLAB中安装YALMIP及CPLEX包
  3. Spring Cloud Stream整合RabbitMQ
  4. Linux虚拟机示范
  5. PHP学习笔记--抽象类和抽象方法的应用
  6. 最大子树和(洛谷-P1122)
  7. 收藏 | 机器学习领域必知必会的12种概率分布(附Python代码实现)
  8. 浅谈CDN技术的性能与优势
  9. Lucene.Net
  10. pdf文字无法复制怎么办?unlock解密pdf
  11. 空间计量模型_5种经典空间计量模型的回归命令、程序及原始数据:SAR模型、SDM模型、SAC模型、SEM模型及GSPRE模型...
  12. 苹果笔记本linux系统安装教程视频教程,苹果系统安装教程,小编教你苹果电脑怎么重装系统...
  13. 【STM32H750】玩转ART-Pi(二)——制作MDK的外部QSPI-FLASH烧录算法
  14. 告别拼接模板 —— 阿里妈妈动态描述广告创意
  15. Message: session not created: This version of ChromeDriver only supports Chrome version XX
  16. windows 连接蓝牙耳机失败 解决方法
  17. 第5章 以太网与FlexRay
  18. Linux服务器搭建----Web服务器(apache)
  19. Smss.exe 进程分析--NT 源码--当机方法
  20. Pauling学编程打卡

热门文章

  1. vue后台管理、APP项目总结集合
  2. IDEA类和方法注释模板
  3. 乐玩插件和大漠插件哪个好_教您用好Home Assistant各种插件系列之媒体播放器插件DLNA_DMR...
  4. 360的声明腾讯要挟用户卸载360周总真有招啊!看看大家相信谁。
  5. 即兴噱头所没有的幽默感
  6. Android消息推送:第三方消息推送平台详细解析
  7. 难道ERP"死了",中台"凉了",低/无代码要称王了?
  8. ubuntu数字小键盘不能输入数字解决办法
  9. 2012第20周国内Android应用下载排行榜动态
  10. Celery - 最佳实践