当前位置:网站首页>力扣每日一题-第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;
}
};
边栏推荐
猜你喜欢
matlab封闭曲线拟合 (针对一些列离散点)
格拉姆角场GAF将时序数据转换为图像并应用于故障诊断
Faster - RCNN principle and repetition code
matlab的2DCNN、1DCNN、BP、SVM故障诊断与结果可视化
数据库:整理四个实用的SQLServer脚本函数
NelSon:一款新的适配matlab编程语法的编程工具
天鹰优化的半监督拉普拉斯深度核极限学习机用于分类
VMD combined with ISSA to optimize LSSVM power prediction
MySQL基础(DDL、DML、DQL)
MAML principle explanation and code implementation
随机推荐
缓动动画,有关窗口的一些常见操作,BOM操作
Triton部署mmdeploy导出的TensorRT模型失败篇
格拉姆角场GAF将时序数据转换为图像并应用于故障诊断
科研绘图图表类型种类繁多,本文告诉你如何选择!
Network skills: teach you to install batteries on the router, you can still surf the Internet when the power is cut off!
A priori box (Anchor) in target detection
idea使用@Autowired注解爆红原因及解决方法
this关键字,构造函数
MySQL大总结
基于EEMD+GRU+MLR的时间序列预测
ffmpeg打开rtsp流应该设置的几个参数
Database Skills: Organize SQL Server's Very Practical Scripts
代码小变化带来的大不同
目标检测中的IoU、GIoU、DIoU与CIoU
Based on the EEMD + + MLR GRU helped time series prediction
如何用matlab做高精度计算?【第一辑】
A semi-supervised Laplace skyhawk optimization depth nuclear extreme learning machine for classification
curl (7) Failed connect to localhost8080; Connection refused
异步编程之promise,任务队列,事件循环
基于子空间结构保持的迁移学习方法MLSSM