每日一题–三数之和
今天来看一道三数之和的面试题,思路比较简单,直接看题。
题目描述
给定一个数组和一个目标值,从数组中找到三个值,使其和最接近目标值。
思路
首先定义一个返回值ans=数组前三项的和,然后将数组排序,并遍历数组,在遍历过程中,用双指针思想,即定义两个变量,分别为l和r,每一次循环都要重新赋值,然后从l和r限定的序列两边开始遍历。定义一个临时值sum=nums[i]+nums[l]+nums[r],然后比较abs(sum-target)和abs(ans-target),若abs(sum-target)<abs(ans-target),则ans=sum。同时比较sum和target的值,若sum<target,l++,若sum>target,r–,若sum==target,返回sum。最后遍历完整个数组,返回ans。
代码实现
int threeSum(vector<int>& v, int target){
int size = v.size();
if(size < 3){
return 0;
}
int ans = v[0] + v[1] + v[2];
sort(v.begin(), v.end());
for(int j = 0; j < size; j++){
int l = j + 1;
int r = size - 1;
while(l < r){
int sum = v[j] + v[l] + v[r];
if(abs(ans - target) > abs(sum - target)){
ans = sum;
}
if(sum == target){
return sum;
}
else if(sum > target){
r--;
}
else if(sum < target){
l++;
}
}
}
return ans;
}
欢迎关注微信公众号“算法日习”,每天分享一道算法题及题解~