leetcode 三数之和
每日一道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 三数之和相关推荐
- LeetCode 三数之和 — 优化解法
LeetCode 三数之和 - 改进解法 题目:给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复 ...
- leetcode三数之和 M015
leetcode M015 三数之和解法的本质就是暴力循环 方法一.纯暴力 原始的暴力循环N^3时间复杂度,代码如下: 很显然超时了 def threeSum(self, nums: List[int ...
- Leetcode 三数之和
三数之和 题目描述: 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组.注意:答案中 ...
- leetcode ---- 三数之和
1.题目: 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组. 注意:答案中不可以包 ...
- leetcode 三数之和 python_16.leetcode题目讲解(Python):最接近的三数之和
题目如下: 题目 这道题可以用排一些特殊情况,减少计算量, 参考代码如下: class Solution: def threeSumClosest(self, nums, target): " ...
- 【LeetCode】两数之和、三数之和、四数之和系列
文章目录 两数之和★ 三数之和★★ 四数之和★★ 四数相加Ⅱ★★ 最接近的三数之和★★ 此篇文章总结下力扣中的两数之和.三数之和.四数之和及一系列求数组中满足达到目标值的元组个数的问题,仔细阅读下面的 ...
- LeetCode实战:最接近的三数之和
题目英文 Given an array nums of n integers and an integer target, find three integers in nums such that ...
- LeetCode实战:三数之和
题目英文 Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? ...
- LeetCode 15三数之和16最接近的三数之和
三数之和(双指针) 题意: 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组. 注意 ...
- Leetcode python《热题 HOT 100》15. 三数之和
Leetcode python 之 <热题 HOT 100>:https://leetcode-cn.com/problemset/hot-100/ 15. 三数之和 给定一个包含 n 个 ...
最新文章
- 清华人工智能研究院成立,张钹姚期智分别任院长和主任
- 股票自动交易python下单接口_用 Python 写了个简单的股票量化交易框架
- java基础-基本的输入与输出
- suse软件管理程序zypper
- CVPR 2019 | 针对人脸识别系统的高效黑盒对抗攻击算法
- 排坑 | Exceptionless 5.x 无法正常发送邮件
- python骗局-python 无良培训忽悠骗局知多少?
- JAVA学习笔记 || 使用Point 类的注意事项
- 做跨境不知道选什么类目,看看这些常青树类目
- laravel安装barryvdh/laravel-snappy 笔记
- Java学习路线和资料分析
- 51单片机利用8266获取网络时间
- Vim - 官方网站
- 误操作清空了回收站文件如何找到文件
- 海关统计:各地级市-进出口与贸易差额(2000-2020)
- 复习C语言随笔 十四
- halcon缺陷检测学习3暗斑检测detect_mura_defects_texture
- 用好了下一代文件系统 Btrfs 这些新特性,从此数据安全乐无忧!
- fps射击HTML网页游戏,HTML网页游戏测试
- 数学分析教程史济怀练习10.5