【LeetCode_15】——三数之和
今天做了力扣中的一道经典题:三数之和。这题思路倒是很快想到,调逻辑可把我调得够呛,这也正说明我的刷题思维远远不够,比起我室友半个月刷300多题的思维差远了。。。革命尚未成功,同志仍需努力。
原题链接:15. 三数之和 - 力扣(LeetCode) (leetcode-cn.com)
题解:题目要我们找到所给数组中所有和为0且不重复的三元数组。
由于题目中所给的数组长度不超过3000,所以最后的算法O(n2)也是可以接受的。数据最大值为1e5,也不用开long long。
如果直接枚举所有的情况,首先在时间复杂度上就无法接受:枚举所有情况需要三重循环,时间复杂度会达到O(n3)。并且暴力枚举的情况复杂,代码量也不小,很麻烦,所以我们要从题中寻找突破口。
题中的关键点在于:nums[i]+nums[j]+nums[k]=0。假设三个元素分别为a,b,c。这就意味着a,b,c三个数不全为正或负,必然有正有负。不妨假设a<=b<=c,那么a必然为负。因此,我们就可以在小于0的范围内枚举a,在大于a的情况下枚举b和c满足a+b+c=0即可。这样可以提升算法的效率,减少不必要的搜索。
根据我们上面的思路,不难发现要想轻松实现需要将数组排序,然后在小于0的范围内根据每一个a来在大于a的范围内枚举b和c。这是b和c的情况就是两数之和的情况了,因为数组已经有序,我们可以使用双指针的方法来解决此问题。
还有最重要的一点:去重,题目中要求不重复的三元组,因此在枚举的过程中我们需要去掉重复的情况。
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> ans;
int n=nums.size();
if(n<3) return {};
sort(nums.begin(),nums.end());
int f,s,t;
for(f=0;f<n-2;f++){ //f的范围只到n-3
if(nums[f]>0) return ans;
if(f>0&&nums[f]==nums[f-1]) continue; //去掉a的重复元素
s=f+1;
t=n-1;
while(s<t){
if(nums[f]+nums[s]+nums[t]==0){
vector<int> res={nums[f],nums[s],nums[t]};
ans.emplace_back(res);
s++;t--;
while(s<t&&nums[s]==nums[s-1]) s++; //去掉b的重复元素
while(s<t&&nums[t]==nums[t+1]) t--; //去掉c的重复元素
}
if(nums[f]+nums[s]+nums[t]>0){
t--;
}
if(nums[f]+nums[s]+nums[t]<0){
s++;
}
}
}
return ans;
}
};
时间复杂度:O(N2)
【LeetCode_15】——三数之和的更多相关文章
- [LeetCode] 3Sum Smaller 三数之和较小值
Given an array of n integers nums and a target, find the number of index triplets i, j, k with 0 < ...
- [LeetCode] 3Sum Closest 最近三数之和
Given an array S of n integers, find three integers in S such that the sum is closest to a given num ...
- [LeetCode] 3Sum 三数之和
Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all un ...
- lintcode: 三数之和II
题目 三数之和 II 给一个包含n个整数的数组S, 找到和与给定整数target最接近的三元组,返回这三个数的和. 样例 例如S = . 和最接近1的三元组是 -1 + 2 + 1 = 2. 注意 ...
- lintcode:三数之和
题目 三数之和 给出一个有n个整数的数组S,在S中找到三个整数a, b, c,找到所有使得a + b + c = 0的三元组. 样例 如S = {-1 0 1 2 -1 -4}, 你需要返回的三元组集 ...
- LeetCode 16. 3Sum Closest. (最接近的三数之和)
Given an array S of n integers, find three integers in S such that the sum is closest to a given num ...
- LeeCode数组第15题三数之和
题目:三数之和 内容: 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中 ...
- LeetCode第十六题-找出数组中三数之和最接近目标值的答案
3Sum Closest 问题简介: 给定n个整数的数组nums和整数目标,在nums中找到三个整数,使得总和最接近目标,返回三个整数的总和,可以假设每个输入都只有一个解决方案 举例: 给定数组:nu ...
- 南大算法设计与分析课程OJ答案代码(4)--变位词、三数之和
问题 A: 变位词 时间限制: 2 Sec 内存限制: 10 MB提交: 322 解决: 59提交 状态 算法问答 题目描述 请大家在做oj题之前,仔细阅读关于抄袭的说明http://www.bi ...
- python三数之和
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以包含重复的三元组. ...
随机推荐
- 2017GPLT
PTA天梯赛2017GPLT 7-6 整除光棍 给定一个不以5结尾的奇数\(x\),求出数字\(n\)使得\(n*x=11...111\),输出数字n和1的位数 题解:模拟竖式除法 我们一开始发现n只 ...
- Scrapy之Request函数回调未执行 Filtered offsite request to 'XXX'
在爬取免费代理ip室发现,第一页爬取之后后续的多页爬取没有被解析.在查看调试信息时发现显示 Filtered offsite request to 'www.kuaidaili.com',经网上查找先 ...
- ESXI密码正确无法登录
场景描述: 今天新安装了一个VMware ESXi 6.5的系统,密码仍然用的习惯采用的密码.但在使用中,无论是使用vSphere Client连接,还是在vCenter Server中添加这台ESX ...
- JVM系列(三):JVM内存结构和参数说明
一.概述,内存结构图 二.堆Heap,存放对象实例,是垃圾回收的主要区域,非堆的内存不进行GC,GC会导致程序运行中断, 物理上可以不连续,堆空间不足时会产生OutOfMemoryException, ...
- Error: (1061, "Duplicate key name 'makerphoto_user_info_email_380c93a0_uniq'")
django.db.utils.OperationalError: (1061, "Duplicate key name 'makerphoto_user_info_email_380c93 ...
- CUDA的新功能
CUDA 9: 配合Volta架构推出: 1. 新的多线程编程范式.Cooperative Groups 2. 优化算法库 CUDA10: 配合Turing架构推出. 1. 新增了对TensorCor ...
- Vue项目的打包方式(生成dist文件)
一.相关配置情况一(使用的工具是 vue-cil) 如果是用 vue-cli 创建的项目,则项目目录中没有 config 文件夹,所以我们需要自建一个配置文件:在根目录 src 下创建文件 vue.c ...
- redis 和docker等名词了解
redis redis产生 redis是MySQL数据库经常直接面对大量的读写访问,面对比较复杂的数据据操作,会导致数据库I/O反映缓慢或者奔溃: 有人研究学习CPU从内寸直接读取数据,把MYSQL经 ...
- css选择器 权重的叠加
- MySQL之中文数据问题
随笔记录方便自己和同路人查阅. #------------------------------------------------我是可耻的分割线--------------------------- ...