• leetcode 3Sum Closest


    题目描述:
    给定一个包含n个整数的数组S和目标整数target,在S中找3个整数,使得这3个整数的和最接近target
    题目来源
    http://oj.leetcode.com/problems/3sum-closest/
    题目分析:
    先对数组排序,然后枚举最小的数n1,对于第二和三个数,用两个索引l和r从两端往中间夹击找,找最接近target - n1的两个数,可以通过“求在一个数组中找两个数,使这两个数的和最接近目标整数newTarget”。
    正确性说明,假设排好序的数组为S1,S2...Si...Sj...Sn,假定最终Si + Sj最接近目标整数newTarget
    (1)若Si + Sj < newTarget 那么Si-k + S < newTarget,Si + Sj+k  > newTarget(如果:Si + Sj+k  < newTarget,那么Si和Sj不是最优值)
    当l先到达i时,Si + Sj+k > newTarget,r会减小至j;当r先到达j时,Si-k + Sj < newTarget,l会增加至i。
    (2)若Si + Sj > newTarget 那么Si + Sj+k  > newTarget,Si-k + S < newTarget(如果:Si-k + S > newTarget,那么Si和Sj不是最优值)
    当l先到达i时,Si + Sj+k > newTarget,r会减小至j;当r先到达i时,Si-k + Sj < newTarget,l会增加至i。
    所以总会找到最优值
    时间复杂度:O(n^2)
    示例代码:
    int threeSumClosest(vector<int> &num, int target) {
        int len = num.size();
        int closestSum = 2147483647, result;
    
        sort(num.begin(), num.end());
        for(int i = 0; i != len - 2; ++i) {
            int l = i + 1, r = len - 1;
            while(l < r) {
                int tmpSum = num[l] + num[r] + num[i];
                if(abs(tmpSum - target) < closestSum) {
                    closestSum = abs(tmpSum - target);
                    result = tmpSum;
                }
                tmpSum > target ? --r : ++l;
            }
        }
    
        return result;
    }
  • 相关阅读:
    Winform中设置ZedGraph曲线图的字体样式是避免出现边框
    50本精品前端开发书籍免费下载
    一切“归零”的开始
    小公司大企业
    给“精点们”的一封信
    一个程序员的自我救赎
    一个微服务框架的情节
    《深入理解Java虚拟机》虚拟机类加载机制
    一个微服务框架的故事
    一个程序员的自我剖析
  • 原文地址:https://www.cnblogs.com/daijinqiao/p/3347124.html
Copyright © 2020-2023  润新知