当前位置: 首页 > news >正文

[LeetCode系列]3元素最近和问题的O(n^2)解法

给定一个整数数组(长度不小于3) 和 一个目标值, 从数组中找出3个元素, 使得它们的和与目标值最接近, 返回这个和. 可以认为每个输入的组合都是只有唯一解的.

解法思路参考: Finding three elements in an array whose sum is closest to an given number.

我们首先将问题P转化为P': 能否从数组中找到3个元素, 使得它们的和最接近0?

这个转化非常简单, 只需要将原数组中的每个数都减去目标值的1/3即可.

随后我们解决P'的方法如下:

  1. 使用快速排序对数组进行排序, 耗费O(nlogn)时间, 这样数组元素就从小到大排列了;
  2. 令 i = 0, 选取第i个元素作为基本元素, 令j = i + 1, k = n - 1, 当j < k时, 进行如下操作
    1. 如果num[i], num[j], num[k]的值更接近于0, 我们就更新结果;
    2. 如果三者的值大于0, 我们就令k = k - 1, 这样就可以选择更小的元素进行求和;
    3. 如果小于0, 我们令j = j + 1.
    4. 如果等于0, 返回0, 算法结束.
  3. 当 i < n - 2时, i = i + 1, 跳到第2步.

代码:

 

 1 class Solution {
 2 public:
 3     int threeSumClosest(vector<int> &num, int target) {
 4         int minSum = num[0] + num[1] + num[2];
 5         
 6         if (num.size() == 3) return minSum;
 7         
 8         int sum = 0;
 9         sort(num.begin(), num.end());
10         // search for the minimal sum of continuous
11         for (int i = 0; i < num.size() - 2; i++) {
12             int j = i + 1;
13             int k = num.size() - 1;
14             while (j < k) {
15                 sum = num[i] + num[j] + num[k];
16                 if (abs(sum - target) < abs(minSum - target)) {
17                     minSum = sum;
18                     if (minSum == target) return minSum;
19                 }
20                 (sum > target)? k--: j++;
21             }
22         }
23         return minSum;
24     }
25 };

 

转载于:https://www.cnblogs.com/lancelod/p/3942764.html

相关文章:

  • 【wikioi】1222 信与信封问题(二分图+特殊的技巧)
  • stm32之PWM
  • java容器---集合总结
  • 将 MySQL 集群放入 Docker 容器
  • 执行ssh-add时出现Could not open a connection
  • Deprecated: Function session_register() is deprec
  • jsp和jspf的关系
  • apk漏洞记录1:伪加密+设备管理器不可删+webview漏洞
  • 图像处理之基础---矩阵求逆实现
  • html+css小知识点
  • MFC之窗体改动工具栏编程状态栏编程程序启动画面
  • UNIX环境编程学习笔记(9)——文件I/O之文件访问权限的屏蔽和更改
  • SoftLayer®凭借Flex Images™消融物理与虚拟服务器之间的界线
  • 康动仪数据传输不成功可以用如下办法解决
  • 如何使用MSDN
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • Bootstrap JS插件Alert源码分析
  • CSS盒模型深入
  • ES6语法详解(一)
  • ES6之路之模块详解
  • extjs4学习之配置
  • gulp 教程
  • JAVA 学习IO流
  • Java比较器对数组,集合排序
  • k8s 面向应用开发者的基础命令
  • Linux Process Manage
  • Phpstorm怎样批量删除空行?
  • QQ浏览器x5内核的兼容性问题
  • quasar-framework cnodejs社区
  • 官方解决所有 npm 全局安装权限问题
  • 理解在java “”i=i++;”所发生的事情
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 我建了一个叫Hello World的项目
  • 我这样减少了26.5M Java内存!
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • 阿里云移动端播放器高级功能介绍
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • 如何用纯 CSS 创作一个货车 loader
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ​ubuntu下安装kvm虚拟机
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • $(function(){})与(function($){....})(jQuery)的区别
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (175)FPGA门控时钟技术
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (汇总)os模块以及shutil模块对文件的操作
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (转载)利用webkit抓取动态网页和链接
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .net 反编译_.net反编译的相关问题
  • .Net 中的反射(动态创建类型实例) - Part.4(转自http://www.tracefact.net/CLR-and-Framework/Reflection-Part4.aspx)...
  • .Net程序帮助文档制作