三数之和姊妹题——LeetCode题目16:最接近的三数之和
时间:2022-07-23
本文章向大家介绍三数之和姊妹题——LeetCode题目16:最接近的三数之和,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
原题描述
+
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
示例
输入:nums=[-1, 2, 1, 4], target=1
输出:2
解释:与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
原题链接:https://leetcode-cn.com/problems/3sum-closest
思路解析
+
这道题我建议你和下面这道题一起看,因为它们的思路几乎一模一样。下面这道题如果会做,那么本题对你来说会变得相当容易。 LeetCode题目15:三数之和
相对于上面这道题来说,本题容易的地方在于不需要考虑去重,这会让双指针的移动更简单,我再讲一下这里面涉及到的两种情况。
假设我们对数组按升序排序,并以第 处的数字为基础,来寻找它的另外两个同伴,那么在这个有序数组上,我们一定可以通过移动处于 右侧的两个边界指针 和 来实现不断逼近target的目的。
情况1——当nums[i]+nums[L]+nums[R] > target时,我们需要左移 来缩小三数之和,这样才有可能找到与target更接近的值。
情况2——当nums[i]+nums[L]+nums[R] <= target时,我们需要右移 来增加三数之和。
好了,现在可以写代码了。
在LeetCode中不会有重复的题目,但是思路接近可以类比的题目确很多。编程和做数学题一样,需要大量的练习才能强化自己的sense和逻辑性。
复杂度分析
+
- 时间复杂度:
- 空间复杂度:
C++参考代码
+
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
int sum = 0;
if (nums.size() < 2) {
for (int i = 0; i < nums.size(); ++i) sum += nums[i];
return sum;
}
sort(nums.begin(), nums.end());
int min_dist = INT_MAX;
for (int i = 0; i < nums.size() - 2; ++i) {
int l = i + 1;
int r = nums.size() - 1;
while (l < r) {
int curr_sum = nums[i] + nums[l] + nums[r];
if (curr_sum < target) {
if (target - curr_sum < min_dist) {
min_dist = target - curr_sum;
sum = curr_sum;
}
++l;
} else {
if (curr_sum - target < min_dist) {
min_dist = curr_sum - target;
sum = curr_sum;
}
--r;
}
}
}
return sum;
}
};
- Oracle数据库漏洞分析:无需用户名和密码进入你的数据库
- Android动态加载入坑指南
- ModSecurity技巧:使用ssdeep检测Webshell
- 装饰者模式
- 经典算法学习之分治法(以排列、组合程序为例)
- Bash概论 - Linux系列教程补充篇
- 我母亲遭遇勒索软件CryptoWall的全过程
- Android浏览器跨域数据窃取和Intent Scheme攻击
- 关于React Native项目在android上UI性能调试实践
- 一文读懂如何用 Python 实现6种排序算法
- 三星KNOX远程静默安装漏洞深入分析报告
- 技术分享:MSSQL注入xp_cmdshell
- 通过5个简单序列预测实例学习LSTM递归神经网络
- Google发现Windows 8.1 0day漏洞并公布漏洞验证程序(PoC)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Python使用对象方式获取字典的值
- Hive整合HBase实现数据同步
- [数据结构与算法] 盘点工作中常用的算法
- MyBatis_resultMap 的关联方式实现多表查询(多对一)
- MyBatis_resultMap的N+1方式实现多表查询(多对 一)
- LeetCode 63. 不同路径 II
- 那些年遇到的刁钻JavaScript面试题(可防踩坑)
- JWT登录鉴权操作笔记 原
- c/c++补完计划(二-改): c字符串复制
- 来个鹅厂C语言面试题试试手?
- -1大于1,-1乘3不等于-3,C语言这个规则你必须得会!
- SQL注入攻击之sqlmap
- 空指针 到底是什么意思?
- 这三行C语言代码到底有没有问题?
- a+=b 和 a=a+b 真的完全等价吗?