LeetCode 16. 最接近的三数之和(中)
类似第15题,不过把判断过程修改成求最小差值,而非等于某个数。
题目
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
示例
1 |
|
考察知识点
数组、双指针、排序
核心思想
类似第15题,不过把判断过程修改成求最小差值,而非等于某个数。
- 本题目因为要计算三个数,如果靠暴力枚举的话时间复杂度会到\(O(n^3)\),需要降低时间复杂度
- 首先进行数组排序,时间复杂度 \(O(nlogn)\)
- 在数组
nums
中,进行遍历,每遍历一个值利用其下标i
,形成一个固定值nums[i]
- 再使用前指针指向
start = i + 1
处,后指针指向end = len(nums) - 1
处,也就是结尾处。 - 根据
sum = nums[i] + nums[start] + nums[end]
的结果,判断sum
与目标target
的距离,如果更近则更新结果ans
- 同时判断
sum
与target
的大小关系,因为数组有序,如果sum > target
则end--
,如果sum < target
则start++
,如果sum == target
则说明距离为 0 直接返回结果 - 整个遍历过程,固定值为
n
次,双指针为n
次,时间复杂度为 \(O(n^2)\) - 总时间复杂度:\(O(nlogn) + O(n^2) = O(n^2)\)
Python版本
根据思路手写的一个版本
1 |
|
时间复杂度\(O(n)\)
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!