016 3Sum Closest[M]

1 题目描述

Given an array S of n integers, find three integers in S such that the sum is closest to a given number, target. Return the sum of the three integers. You may assume that each input would have exactly one solution.

难度:Medium

2 题目样例

For example, given array S = {-1 2 1 -4}, and target = 1.

The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).

3 题目分析

题设和前一题3Sum比较相似,只有微小的不同:

  • 保证只有一组最符合题意的返回值。
  • 要返回的是其和与目标数字最接近的三个数,也就是说不一定保证存在三个数恰好之和等于目标数字。

4 思路分析

不仅仅是题设,思路上也和之前的3Sum基本一致。只要针对以下的部分,对3Sum的代码进行修改即可:

在类似于3Sum的遍历过程中,只要一直维护三数之和与目标数字的差值,并把差值最小的那组数据记录并返回即可。排序当然是有必要的了。

代码实现如下:

class Solution 

{  
    
public:  
    
    int threeSumClosest(vector<int> &num, int target)
    
    {  
        int res = num[0] + num[1] + num[2];    
  
        std::sort(num.begin(), num.end());  
  
        for (int i = 0; i <=num.size(); i++) 
        
        {  
            
            int front = i + 1; 
            
            int back = num.size() - 1;   
            
            while (front < back) 
            
            {  
                int sum = num[i] + num[front] + num[back];  
                
                if (abs(sum - target) < abs(res - target))  
                    
                    res = sum;  
                
                if (sum < target) 
                
                    
                    front++;  
            
                
                else if (sum > target) 
                
                  
                   back--;     
                
                
                else
                
                {  
                    front++; 
                    
                    back--;  
                }  
            }  
        }  
        
        return res;  
    }  
};  

5 后记

kSum问题是一类问题,也是面试题中比较常见的题目。有兴趣的小伙伴,可以在做完3Sum的这两道题和4Sum之后,写一个非暴力算法的KSum问题通解出来。

    原文作者:Lolita
    原文地址: https://zhuanlan.zhihu.com/p/33731116
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞