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

分析

这题目与上一题十分相似。求出整数数组序列中与目标值最接近的三元组元素之和。

解这个题目条件反射的方法是三层遍历,求和比较,但是显而易见,在LeetCode提交时必然会出现超时的异常。所以必须另觅他法,这个题目的AC代码源于参考,在此表示感谢。

Time Limit Exceeded代码

class Solution {
public:

    //方法一:三层穷举,超时异常
    int threeSumClosest(vector<int>& nums, int target) {

        int len = nums.size();
        if (len < 3)
        {
            return 0;
        }
        int closest = nums[0] + nums[1] + nums[2];

        for (int i = 1; i < len-2; i++)
        {
            //首先进行去重操作
            if (nums[i] == nums[i - 1])
                continue;

            for (int j = i + 1; j < len - 1; j++)
            {
                if (nums[j] == nums[j - 1])
                    continue;
                for (int k = j + 1; k < len; k++)
                {
                    if (nums[k] == nums[k - 1])
                        continue;
                    int sum = nums[i] + nums[j] + nums[k];

                    if (sum == target)
                    {
                        closest = sum;
                        break;
                    }//if
                    else    if (abs(sum - target) < abs(closest - target))
                    {
                        closest = sum;
                    }//elif
                    else
                        continue;
                }//for
            }//for
        }//for

        return closest;
    }
    int abs(int a)
    {
        return a > 0 ? a : 0-a;
    }
};

AC代码

class Solution {
public:
    int threeSumClosest(vector<int>& nums, int target) {
        size_t size = nums.size();
        if (size < 3)
        {
            cout << "num size must bigger than there!" << endl;
            return 0;
        }
        sort(nums.begin(), nums.end());   // 对于以下的处理过程必须事先排序,类似二分搜索
        int result = 0;     // 记录最终结果
        int distance = numeric_limits<int>::max();    // signed int
        int sum = 0;        // 中间结果
        size_t i = 0, j = i + 1, k = size - 1;

        for (i = 0; i < size - 2; i++)    // 三元组的第一个元素一次遍历,范围为[0...n-3]
        {
            // 去重避免重复计算,如果和上次同则跳过
            if (i > 0 && nums[i] == nums[i - 1])
            {
                continue;
            }

            j = i + 1;  // 选定三元组第一个元素后,第二个元素从第一个元素的下一个位置开始考察
            k = size - 1;   // 选定三元组第一个元素后,第三个元素从数组末尾开始考察
            while (j < k)    // 三元组的后两个元素利用左右逼近来跳过效率,选定第一个元素后,其后的所有元素只需考察一遍
            {
                sum = nums[i] + nums[j] + nums[k];
                if (sum == target)  // 存在距离最近为0则直接返回,否则穷举选取非0最小距离
                {
                    return sum;
                }
                else if (sum < target)
                {
                    if ((target - sum) < distance)
                    {
                        result = sum;
                        distance = target - sum;
                    }
                    j = j + 1;
                    // 避免重复计算,如果和上次同则跳过
                    if (nums[j] == nums[j - 1])
                    {
                        j = j + 1;
                    }
                }
                else if (sum > target)
                {
                    if ((sum - target) < distance)
                    {
                        result = sum;
                        distance = sum - target;
                    }
                    k = k - 1;
                    // 避免重复计算如果和上次同则跳过
                    if (nums[k] == nums[k + 1])
                    {
                        k = k - 1;
                    }

                }
            }
        }
        return result;
    }
};

GitHub测试程序源码

时间: 2024-10-27 05:34:54

LeetCode(16)3Sum Closest的相关文章

leetcode第16题--3Sum Closest

Problem: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

LeetCode(15) 3Sum

题目 Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero. Note: Elements in a triplet (a,b,c) must be in non-descending order. (ie, a ≤ b ≤ c) The so

HTML基础教程(16)——HTML颜色名--

页提供了被大多数浏览器支持的颜色名. 提示:仅有 16 种颜色名被 W3C 的 HTML 4.0 标准支持,它们是:aqua.black.blue.fuchsia.gray.green.lime.maroon.navy.olive.purple.red.silver.teal.white.yellow. 如果使用其它颜色的话,就应该使用十六进制的颜色值. 颜色名列表 单击一个颜色名或者 16 进制值,就可以查看与不同文字颜色搭配的背景颜色. 颜色名 十六进制颜色值 颜色 AliceBlue  #

HTML5移动开发之路(16)——神奇的拖放功能

本文为 兄弟连IT教育 机构官方 HTML5培训 教程,主要介绍:HTML5移动开发之路(16)--神奇的拖放功能 在智能手机发展飞速的现在拖放功能已经成为一种时尚,但是在我们的浏览器上是不是还缺少这种方便快捷的功能?在HTML5的新标准中就有关于拖放的标准,作为HTML5标准的一部分,任何元素都可以被拖放. 一.浏览器支持情况 Internet Explorer 9.Firefox.Opera 12.Chrome 以及 Safari 5 支持拖放. 注释:在 Safari 5.1.2 中不支持

算法导论读书笔记(16)

算法导论读书笔记(16) 目录 动态顺序统计 检索具有给定排序的元素 确定一个元素的秩 区间树 步骤1:基础数据结构 步骤2:附加信息 步骤3:维护信息 步骤4:设计新操作 动态顺序统计 之前介绍过 顺序统计 的概念.在一个无序的集合中,任意的顺序统计量都可以在 O ( n )时间内找到.而这里我们将介绍如何在 O ( lg n )时间内确定任意的顺序统计量. 下图显示的是一种支持快速顺序统计量操作的数据结构.一棵 顺序统计树 T 通过在红黑树的每个结点中存入附加信息而成.在一个结点 x 内,增

(16)观察者模式

 (16)观察者模式 定义:定义对象间一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新. 类型:行为类模式 类图: 在软件系统中经常会有这样的需求:如果一个对象的状态发生改变,某些与它相关的对象也要随之做出相应的变化.比如,我们要设计一个右键菜单的功能,只要在软件的有效区域内点击鼠标右键,就会弹出一个菜单:再比如,我们要设计一个自动部署的功能,就像eclipse开发时,只要修改了文件,eclipse就会自动将修改的文件部署到服务器中.这两个功能有一个

解读ASP.NET 5 &amp; MVC6系列(16):自定义View视图文件查找逻辑

原文:解读ASP.NET 5 & MVC6系列(16):自定义View视图文件查找逻辑 之前MVC5和之前的版本中,我们要想对View文件的路径进行控制的话,则必须要对IViewEngine接口的FindPartialView或FindView方法进行重写,所有的视图引擎都继承于该IViewEngine接口,比如默认的RazorViewEngine.但新版本MVC6中,对视图文件的路径方式却不太一样了,目前有两种方式,一种是通过RazorViewEngine,另外一种是通过新特性IViewLoc

寻找自适应元素(16)-自动向下填充公式

寻找自适应元素(16)-自动向下填充公式 设计要点:excle.界面.自动调整 秀秀:还有一个功能特别强大. 阿金:什么? 秀秀:自动向下填充公式. 阿金:嗯,说实话,这个功能非常有用. 秀秀:你也知道? 阿金:当然!因为透视表也可以有这个功能!只要配合"导入外部数据"就行. 秀秀:但是,俺说的就没有那么多附加条件,只要在"工具"-"选项"-"编辑"里设置"扩展数据区域格式和公式"就OK啦. 阿金:啊,又算

优化数据页面(16)——表题尽量窄于表格

优化数据页面(16)--表题尽量窄于表格 设计要点:优化数据页面.界面设计.美化exce 秀秀:你不是"很"有研究么?难道就局限于"提炼"这一条? 阿金:唉,听你说模仿别人的就行,所以俺没有研究动力了. 秀秀:可别呀!你刚讽刺了俺们学文的,就没你事了?说说吧, 阿金:好吧.第二条就是表题要尽量窄于表格的大小. 秀秀:嗯.这有点儿道理,这样符合人们的视觉习惯. 阿金:噢?你又赞同俺的研究了? 秀秀:NO!因为这不是关于"文科"的,而是"视