LeetCode 16. 最接近的三数之和(3Sum Closest)

 

题目描述

 

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

例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.

与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).

 

解题思路

 

考虑用双指针法解题。首先将数组从小到大排序,并令最接近的数closest初始化为前三个数的和。每遍历到一个数,计算后面两个数之和比较的目标tar=target-nums[i],然后令左指针left指向其后第一个数,右指针right指向最后一个数,然后计算左右指针指向数字之和与tar的差sum。

  • 若sum为0,则说明此时三个数的和正好为target,所以直接返回target
  • 若sum的绝对值小于closest-target的绝对值,说明此时三个数的和为最接近target的数,所以更新closest
  • 若左右指针指向的数字之和小于tar,此时令左指针向右移动一位有可能让和更接近tar;否则让右指针左移一位。这样移动直到左右指针重合

 

代码

 

 1 class Solution {
 2 public:
 3     int threeSumClosest(vector<int>& nums, int target) {
 4         sort(nums.begin(),nums.end());
 5         int closest=nums[0]+nums[1]+nums[2],l=nums.size();
 6         for(int i=0;i<l-2;i++){
 7             int left=i+1,right=l-1;
 8             int tar=target-nums[i];
 9             int sum;
10             while(left<right){
11                 sum=nums[left]+nums[right]-tar;
12                 if(sum==0)
13                     return target;
14                 if(abs(sum)<abs(closest-target))
15                     closest=target+sum;
16                 if(nums[left]+nums[right]<tar)
17                     left++;
18                 else
19                     right--;
20             }
21         }
22         return closest;
23     }
24 };

 

posted @ 2018-05-22 21:17  FlyingWarrior  阅读(374)  评论(0编辑  收藏  举报