标签:continue 目标 包括 输入 for twosum 重复数 lse 处理
做法:hash表,O(n)
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
map<int,int>mp;
for(int i=0;i<nums.size();i++)
{
int t=target-nums[i];
if(mp.find(t)!=mp.end())
return {i,mp[t]};
mp[nums[i]]=i;
}
return {0,0};
}
};
做法:先排序O(nlogn),第一个数移动,后两个数用two sum的双指针的做法,总时间复杂度O(n * n),由于不可以包含重复的三元组,因此处理完后需要对临近的重复数去掉
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>>result;
int n=nums.size();
sort(nums.begin(),nums.end());
for(int i=0;i<n;i++)
{
//确保i改变了
if(i>0&&nums[i]==nums[i-1]) continue;
int t=-nums[i];
int j=i+1,k=n-1;
while(j<k)
{
if(nums[j]+nums[k]>t) k--;
else if(nums[j]+nums[k]<t) j++;
else
{
vector<int>ans;
ans.push_back({nums[i],nums[j],nums[k]});
result.push_back(ans);
//确保j改变了
while(j<k&&nums[j]==nums[j+1])j++;
//确保k改变了
while(j<k&&nums[k]==nums[k-1])k--;
j++,k--;
}
}
}
return result;
}
};
同上排序,后双指针,同时跟新最接近这一个性质。
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
int n=nums.size();
//先排序
sort(nums.begin(),nums.end());
int closesum=nums[0]+nums[1]+nums[2];
for(int i=0;i<n-2;i++)
{
int l=i+1,k=n-1;
while(l<k)
{
int threesum=nums[i]+nums[l]+nums[k];
if(abs(threesum-target)<abs(closesum-target))
closesum=threesum;
if(threesum>target) k--;
else if(threesum<target) l++;
else
{
return target;
}
}
}
return closesum;
}
};
类似三数之和,时间复杂度O( n * n * n )
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
int n=nums.size();
sort(nums.begin(),nums.end());
vector<vector<int>>res;
if(n<4) return res;
for(int i=0;i<n-3;i++)
{
//确保nums[a]改变了
if(i>0&&nums[i]==nums[i-1]) continue;
for(int j=i+1;j<n-2;j++)
{
//确保nums[b]改变了
if(j>i+1&&nums[j]==nums[j-1]) continue;
int c=j+1,d=n-1;
while(c<d)
{
if(nums[i]+nums[j]+nums[c]+nums[d]<target) c++;
else if(nums[i]+nums[j]+nums[c]+nums[d]>target) d--;
else
{
res.push_back({nums[i],nums[j],nums[c],nums[d]});
//确保nums[c]改变了
while(c<d&&nums[c]==nums[c+1])c++;
//确保nums[d]改变了
while(c<d&&nums[d]==nums[d-1])d--;
c++,d--;
}
}
}
}
return res;
}
};
标签:continue 目标 包括 输入 for twosum 重复数 lse 处理
原文地址:https://www.cnblogs.com/Tsukinousag1/p/14667696.html