每日一道leetcode:

题目:(难度 中)

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

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

由于这是第一次认真做题,所以记录下我的思想变化过程吧。首先,由于之前没有什么积累,我首先想到的是利用三个for循环,来寻找a+b+c = 0的三个值,当然,使用的for循环的结构是index -> index+1 -> index+2这种结构。这样,便很容易的找到了a+b+c=0的值,但是找到之后还需要判断有没有与之前的a1+b1+c1 = 0重复。在这里我之前一点思路都没有,想了很久,终于想到先用排序算法进行冲小到达排序,然后再对用的位置相比较就可以了。

首先来复习一下冒泡排序:

大概结构是这样的(下面是伪代码):

for i = 0 to Len :for j = 0 to Len-i-1:if(v[j] > v[j+1]){交换v[j]和v[j+1]的值}end
end

然后,再来看看我写的源代码吧:(最近在学C++,所以代码使用C++写的)

class Solution {
public:void sort(vector<int> &v) {int temp;for (int i = 0; i< v.size()-1; i++) {for (int j = i + 1; j < v.size(); j++) {if (v[i]>v[j]) { temp = v[i];v[i] = v[j];v[j] = temp;}}}}vector<vector<int>> threeSum(vector<int>& nums) {vector<int> v1;vector<vector<int>> v2;for(vector<int>::iterator it1 = nums.begin();it1 != nums.end()-2;it1++){for(vector<int>::iterator it2 = it1+1;it2 != nums.end();it2++){for(vector<int>::iterator it3 = it1+2;it3 != nums.end();it3++){if(*it1+ *it2 + *it3 == 0){v1.push_back(*it1);v1.push_back(*it2);v1.push_back(*it3);this->sort(v1);int flag=1;for(vector<vector<int>>::iterator it4=v2.begin();it4 != v2.end();it4++){if((*it4)[0]==v1[0] && (*it4)[1]==v1[1] && (*it4)[2]==v1[2]){flag = 0;}}if(flag==1){v2.push_back(v1);}}v1.clear();}}}return v2;}};

这个代码对测试案例还不错:

但是,提交了代码之后就不行了。原因是复杂度太高了,所以运行超时了:

然后,我再来看看别人的思路吧:(随便找了一个,使用的是双指针法):

果然很厉害:来欣赏一下别人的代码吧!

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> result;sort(nums.begin(), nums.end());// 找出a + b + c = 0// a = nums[i], b = nums[left], c = nums[right]for (int i = 0; i < nums.size(); i++) {// 排序之后如果第一个元素已经大于零,那么无论如何组合都不可能凑成三元组,直接返回结果就可以了if (nums[i] > 0) {return result;}// 错误去重方法,将会漏掉-1,-1,2 这种情况/*if (nums[i] == nums[i + 1]) {continue;}*/// 正确去重方法if (i > 0 && nums[i] == nums[i - 1]) {continue;}int left = i + 1;int right = nums.size() - 1;while (right > left) {// 去重复逻辑如果放在这里,0,0,0 的情况,可能直接导致 right<=left 了,从而漏掉了 0,0,0 这种三元组/*while (right > left && nums[right] == nums[right - 1]) right--;while (right > left && nums[left] == nums[left + 1]) left++;*/if (nums[i] + nums[left] + nums[right] > 0) {right--;} else if (nums[i] + nums[left] + nums[right] < 0) {left++;} else {result.push_back(vector<int>{nums[i], nums[left], nums[right]});// 去重逻辑应该放在找到一个三元组之后while (right > left && nums[right] == nums[right - 1]) right--;while (right > left && nums[left] == nums[left + 1]) left++;// 找到答案时,双指针同时收缩right--;left++;}}}return result;}
};作者:carlsun-2
链接:https://leetcode-cn.com/problems/3sum/solution/15-san-shu-zhi-he-ha-xi-fa-shuang-zhi-zh-jk8s/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

leetcode 三数之和相关推荐

  1. LeetCode 三数之和 — 优化解法

    LeetCode 三数之和 - 改进解法 题目:给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复 ...

  2. leetcode三数之和 M015

    leetcode M015 三数之和解法的本质就是暴力循环 方法一.纯暴力 原始的暴力循环N^3时间复杂度,代码如下: 很显然超时了 def threeSum(self, nums: List[int ...

  3. Leetcode 三数之和

    三数之和 题目描述: 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组.注意:答案中 ...

  4. leetcode ---- 三数之和

    1.题目: 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组. 注意:答案中不可以包 ...

  5. leetcode 三数之和 python_16.leetcode题目讲解(Python):最接近的三数之和

    题目如下: 题目 这道题可以用排一些特殊情况,减少计算量, 参考代码如下: class Solution: def threeSumClosest(self, nums, target): " ...

  6. 【LeetCode】两数之和、三数之和、四数之和系列

    文章目录 两数之和★ 三数之和★★ 四数之和★★ 四数相加Ⅱ★★ 最接近的三数之和★★ 此篇文章总结下力扣中的两数之和.三数之和.四数之和及一系列求数组中满足达到目标值的元组个数的问题,仔细阅读下面的 ...

  7. LeetCode实战:最接近的三数之和

    题目英文 Given an array nums of n integers and an integer target, find three integers in nums such that ...

  8. LeetCode实战:三数之和

    题目英文 Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? ...

  9. LeetCode 15三数之和16最接近的三数之和

    三数之和(双指针) 题意: 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组. 注意 ...

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

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

最新文章

  1. 清华人工智能研究院成立,张钹姚期智分别任院长和主任
  2. 股票自动交易python下单接口_用 Python 写了个简单的股票量化交易框架
  3. java基础-基本的输入与输出
  4. suse软件管理程序zypper
  5. CVPR 2019 | 针对人脸识别系统的高效黑盒对抗攻击算法
  6. 排坑 | Exceptionless 5.x 无法正常发送邮件
  7. python骗局-python 无良培训忽悠骗局知多少?
  8. JAVA学习笔记 || 使用Point 类的注意事项
  9. 做跨境不知道选什么类目,看看这些常青树类目
  10. laravel安装barryvdh/laravel-snappy 笔记
  11. Java学习路线和资料分析
  12. 51单片机利用8266获取网络时间
  13. Vim - 官方网站
  14. 误操作清空了回收站文件如何找到文件
  15. 海关统计:各地级市-进出口与贸易差额(2000-2020)
  16. 复习C语言随笔 十四
  17. halcon缺陷检测学习3暗斑检测detect_mura_defects_texture
  18. 用好了下一代文件系统 Btrfs 这些新特性,从此数据安全乐无忧!
  19. fps射击HTML网页游戏,HTML网页游戏测试
  20. 数学分析教程史济怀练习10.5

热门文章

  1. SparkSQL和HiveSql的对比
  2. 浙江大学三位一体招生?
  3. 超实用的doc 转 docx
  4. Reno与RACK对丢失/重传报文的标记
  5. MTK6577+Android之按键(key)修改
  6. PassMark 更新排行,苹果 M1 杀疯了
  7. NoteFirst的Word插件(WordAddIn)安装过程中遇到的问题和解决方案
  8. LMS自适应波束形成算法(MATLAB)
  9. 期末考试打乱考研数学复习,该怎么继续?
  10. Windows快速访问无法取消固定