当前位置:网站首页>力扣每日一题-第47天-15. 三数之和
力扣每日一题-第47天-15. 三数之和
2022-08-04 05:44:00 【重邮研究森】
2022.8.3今天你刷题了吗?
题目:
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
分析:
给定一个数组,我们需要找到三个数加起来为0的三个数,并且最后返回时不能有重复。那么对于这个问题,思路是:
首先利用一个二维数组来存放满足加起来=0的数,找到了这些数之和,对二维数组进行清除重复元素操作,最终得到我们的结果。在找元素时,利用暴力法,依次遍历数组,找到满足的所有元素,对于重复元素去除,可以利用文中那个简单的两行代码完成。
解析:
1.暴力法
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
int tmp = 0;
int temp = 0;
int flag = 0;
int x = 0;
vector<int>vec1;
vector<vector<int>>vec;
if (nums.size() == 0)
{
return vec;
}
for (int i = 0; i < nums.size()-2; i++)
{
for (int j = i+1; j < nums.size(); j++)
{
tmp = 0 - nums[i] - nums[j];
temp = nums[j];
x = j;
while (x < nums.size())
{
if (x < nums.size()-1&&tmp == nums[x+1])
{
vec1.push_back(tmp);
vec1.push_back(temp);
vec1.push_back(nums[i]);
sort(vec1.begin(), vec1.end());
vec.push_back(vec1);
vec1.clear();
break;
}
x++;
}
}
}
//清楚重复元素
sort(vec.begin(), vec.end());
vec.erase(unique(vec.begin(), vec.end()), vec.end());
return vec;
}
};2.指针法
这是官方的双指针
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
int n = nums.size();
sort(nums.begin(), nums.end());
vector<vector<int>> ans;
// 枚举 a
for (int first = 0; first < n; ++first) {
// 需要和上一次枚举的数不相同
if (first > 0 && nums[first] == nums[first - 1]) {
continue;
}
// c 对应的指针初始指向数组的最右端
int third = n - 1;
int target = -nums[first];
// 枚举 b
for (int second = first + 1; second < n; ++second) {
// 需要和上一次枚举的数不相同
if (second > first + 1 && nums[second] == nums[second - 1]) {
continue;
}
// 需要保证 b 的指针在 c 的指针的左侧
while (second < third && nums[second] + nums[third] > target) {
--third;
}
// 如果指针重合,随着 b 后续的增加
// 就不会有满足 a+b+c=0 并且 b<c 的 c 了,可以退出循环
if (second == third) {
break;
}
if (nums[second] + nums[third] == target) {
ans.push_back({nums[first], nums[second], nums[third]});
}
}
}
return ans;
}
};
边栏推荐
- 基于子空间结构保持的迁移学习方法MLSSM
- 数据库技巧:整理SQLServer非常实用的脚本
- DOM的12中节点类型,通过关系或方法获取DOM节点,渲染到浏览器页面的一些特效功能,获取DOM节点来改变属性,点击图片,切换为所点击的图片为背景图,页面上的表单验证,点击底部导航栏切换界面
- Time Series Forecasting Based on Reptile Search RSA Optimized LSTM
- 类图规范总结
- MySQL - Row size too large (> 8126). Changing some columns to TEXT or BLOB
- SegNet——论文笔记
- SQL如何从字符串截取指定字符(LEFT、MID、RIGHT三大函数)
- 对象的扩展补充
- 秒杀系统设计
猜你喜欢

网络技巧:教你给路由器装上电池,断电照样可以上网!

Sql优化总结!详细!(2021最新面试必问)

【C# - 爬虫】使用Selenium实现爬虫,获取近七天天气信息(包含完整代码)

Database: Organize Four Practical SQL Server Scripting Functions

ERROR 2003 (HY000) Can‘t connect to MySQL server on ‘localhost3306‘ (10061)解决办法

Error occurred while trying to proxy request项目突然起不来了

指定区域内随机填充圆之matlab实现

花了近70美元入手的学生版MATLAB体验到底如何?

Online public account article content to audio file practical gadget

手把手教你Charles抓包工具使用
随机推荐
MySQL(4)
U-Net详解:为什么它适合做医学图像分割?(基于tf-Kersa复现代码)
MySQL重置root密码
如何用matlab做高精度计算?【第一辑】
SENet详解及Keras复现代码
mysql月份比較是否相等
Database knowledge: SQLServer creates non-sa user notes
Hardware Knowledge: Introduction to RTMP and RTSP Traditional Streaming Protocols
Database Skills: Organize SQL Server's Very Practical Scripts
SegNet——论文笔记
Network skills: teach you to install batteries on the router, you can still surf the Internet when the power is cut off!
花了近70美元入手的学生版MATLAB体验到底如何?
matlab让我的旧手机起死回生
Computer software: recommend a disk space analysis tool - WizTree
狗都能看懂的Self-Attention讲解
Provide 和 Inject 的用法
搭建redis哨兵
SQL去重的三种方法汇总
MySQL外键(详解)
网络技巧:教你给路由器装上电池,断电照样可以上网!