三数之和

每日一题–三数之和

今天来看一道三数之和的面试题,思路比较简单,直接看题。
题目描述
  给定一个数组和一个目标值,从数组中找到三个值,使其和最接近目标值。
思路
  首先定义一个返回值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;
}

欢迎关注微信公众号“算法日习”,每天分享一道算法题及题解~
  在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值