PigyChan_LeetCode 16. 最接近的三数之和

16. 最接近的三数之和

难度中等

给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。

示例:

输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。

提示:
* 3 <= nums.length <= 10^3
* -10^3 <= nums[i] <= 10^3
* -10^4 <= target <= 10^4

思路1.0(已看题解):

(1)先排序数组
(2)一个固定值nums[i],与两个有范围的变动值组合nums[start],start=i+1,end=nums.size()-1。
(3)根据这三个值的和sum与target的距离判断接下来对start与end的移动。
1)abs(sum-target) < abs(ans-target),ans = sum;
2)sum>target,–end
3)sum<target,++start

代码1.0:
  class Solution {
  public:
      int threeSumClosest(vector<int>& nums, int target) {
          sort(nums.begin(), nums.end());


          int cur = 0;
          int start = 1;
          int end = nums.size()-1;
          int ans = nums[cur] + nums[start] + nums[end];
          
          while (cur < nums.size() - 2) {


              while (start < end) {
                  int sum = nums[cur] + nums[start] + nums[end];
                  if (sum == target) return sum;

                  if (abs(sum - target) <= abs(ans - target))
                  {
                      ans = sum;
                  }

                  //三数之和过大
                  if (sum > target) {
                      --end;
                  }
                  //三数之和过小
                  else {
                      ++start;
                  }
              }

              ++cur;
              start = cur + 1;;
              end = nums.size() - 1;
          }


          return ans;
      }
  };



在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值