用暴力法是三层循环,在这里我使用的是两层循环,在第二层循环中使用双指针的方法,这样可以降低时间复杂度
下面这段程序写的是第三个数字右边减少的情况,明天写一个用一个循环,左右以此缩进的情况
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
sort(nums.begin(),nums.end());
int ans=abs(nums[0]+nums[1]+nums[2]-target);
int A,B,C;
for(int i=0;i<nums.size();i++){
for(int j=i+1;j<nums.size();j++){
int k=nums.size()-1;
while(j<k){//双指针,降低这个
int sum=nums[i]+nums[j]+nums[k];
int dis=abs(sum-target);
if(dis<=ans){
ans=dis;
A=i;
B=j;
C=k;
}
k--;//右边减少
}
}
}
return nums[A ]+nums[B ]+nums[C];
}
};
这种比较残暴,还是用两个循环。下面这个是用一个循环,用两个指针一左一右依次跟随指针,左右上升
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
sort(nums.begin(),nums.end());
int res=nums[0]+nums[1]+nums[2];
int sum;
for(int i=0;i<nums.size();i++){
int l=i+1;
int r=nums.size()-1;
while(l<r){
sum=nums[i]+nums[l]+nums[r];
if(abs(sum-target)<abs(res-target)){
res=sum;}
if(sum<target){
l++;
}
else if(sum>target){
r--;
}
else{
return res;
}
}
}
return res;
}
};