标签:15 nums int 三数 ++ while vector res leetcode
方法1:
时间240MS 空间20.3MB
思路
首先进行排序,对于每个元素,设置两个指针,像该元素两边找,如果和等于0即为所需三元组,小于0右指针就右移,大于0左指针就左移。对于重复元素进行两种处理,第一对于找到三元组的情况下,左右指针一直移动直到遇到一个与当前不同的值。第二对于当前元素也一直右移直到找到一个不同值。但是这样对于出现两个相同值的情况会漏掉加入了一个相同值的判断。这样出现的三元组就几乎没有重复了,但是还会在三个以上相同元素时重复,所以最后用SET进行去重。
代码:
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
sort(nums.begin(),nums.end());
int n=nums.size();
int i=0;
vector< vector<int> >res;
while(i<n)
{
int p=i-1;
int q=i+1;
int tag=1;
while(p>=0&&q<n)
{
int temp=nums[p]+nums[i]+nums[q];
if(temp==0)
{
vector< int> e={nums[p],nums[i],nums[q]};
res.push_back(e);
tag=0;
while(p-1>=0&&nums[p-1]==nums[p])
{
p--;
}
if(p>=0)p--;
while(q+1<n&&nums[q+1]==nums[q])
{
q++;
}
if(q<n)q++;
}
if(temp<0)
{
q++;
}
if(temp>0)
{
p--;
}
}
if(tag==0)
{
if(i+1<n&&nums[i+1]==nums[i])
{
for(int j = i + 2; j < n; j++)
{
if(nums[j] + 2 * nums[i] == 0)
{
vector< int> e={nums[i],nums[i],nums[j]};
res.push_back(e);
break;
}
}
}
while(i+1<n&&nums[i+1]==nums[i])
{
i++;
}
i++;
tag=1;
}
else
{
i++;
}
}
set< vector<int> > se(res.begin(),res.end());
res.assign(se.begin(),se.end());
return res;
}
};
方法2: 时间196MS 空间15.8MB
思路:我们在方法1下发现可以将其进行两个相同值的元素和所有元素均不相同两类讨论,这样做的好处是没有重复元素。
代码:
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int> > res;
sort(nums.begin(), nums.end());
int n = nums.size();
for(int i = 0; i < n; i++)
{
if(i > 0 && nums[i-1] == nums[i])
{
for(int j = i + 1; j < n; j++)
{
if(nums[i -1] + nums[i] + nums[j] == 0)
{
vector<int> e = {nums[i - 1], nums[i], nums[j]};
res.push_back(e);
break;
}
}
while(i < n && nums[i - 1] == nums[i]) i++;
}
int j = i - 1;
int k = i + 1;
while(j >= 0 && k < n)
{
if(nums[j] + nums[i] + nums[k] == 0)
{
vector<int> e = {nums[j], nums[i], nums[k]};
res.push_back(e);
j--;
k++;
while(j >= 0 && nums[j] == nums[j + 1]) j--;
while(k < n && nums[k] == nums[k - 1]) k++;
}
else if(nums[j] + nums[i] + nums[k] < 0)
{
k++;
}
else
{
j--;
}
}
}
return res;
}
};
代码二是我朋友写的,谢谢大佬提供的思路。
标签:15,nums,int,三数,++,while,vector,res,leetcode 来源: https://blog.csdn.net/qq_39050745/article/details/89889435
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。