zoukankan      html  css  js  c++  java
  • 16. 3Sum Closest

    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.

        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).
    

     寻找三个数,使这三个数之和最接近target的值。

    注意点包括取绝对值,遍历方法。一般遇到在一个列表里寻找三个数的情况,遍历方法一般为:

    forint i = 0; i < totalNum; i++){
    
      int j = i+1;
      int k = totalNum - 1;
    
          while(j<k){
    
      //接着看情况使  j++ 或  k--
        }
    }

    答案:

    class Solution {
    public:
        int threeSumClosest(vector<int> &num, int target) {        
        vector<int> v(num.begin(), num.end()); // 复制原容器内数据,排序时不破坏原数据
        int n = 0;
        int ans = 0;
        int sum;
        
        sort(v.begin(), v.end());            //对里面的数据元素排序
        
                                             
        while (v.size() <= 3) {              // 如果小于三个数,不用寻找,直接返回他们的和
            return accumulate(v.begin(), v.end(), 0);
        }
        
        n = v.size();
        ans = v[0] + v[1] + v[2];
        for (int i = 0; i < n-2; i++) {        //当一个元素固定式(i),剩余两个数据相互逼近来寻找最适元素,
            int j = i + 1;                     //一边从下一个元素开始
            int k = n - 1;                     //一边从最后一个元素开始。
            while (j < k) {                    //当j,k没有相遇
                sum = v[i] + v[j] + v[k];
                if (abs(target - ans) > abs(target - sum)) {
                    ans = sum;
                    if (ans == target) return ans;
                }
                (sum > target) ? k-- : j++;     
            //当sum大于target时,说明三个数之和太大了,应该让k向左走寻找更小的数据,而不是让j++寻找更大的数;反之。。。
            }
        }
        return ans;
    }
    };
     
  • 相关阅读:
    1641. 统计字典序元音字符串的数目
    1688. 比赛中的配对次数
    核心思路
    面试题 16.17. 连续数列
    70. 爬楼梯
    面试题 08.01. 三步问题
    剑指Offer 42. 连续子数组的最大和
    设计模式之原型模式
    代理模式之动态代理
    设计模式之禅(六大设计原则)
  • 原文地址:https://www.cnblogs.com/hozhangel/p/7815295.html
Copyright © 2011-2022 走看看