当前位置:   article > 正文

LeetCode 16 - 3Sum Closest

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.

Given array S = {-1,2,1,-4}, and target = 1.
The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).

给定一个包含 n 个整数的数组,以及一个目标整数 target,在数组中找出三个数,使它们的和 与 target 的距离最小。返回这三个数的和。

假定每个输入一定有结果。


二、解题报告

同《LeetCode 15 - 3Sum》一样,本题我们也是要利用排序这个性质,来减少判断。

思路:

  1. 先整体排一次序
  2. 然后遍历数组,固定一个元素,对其后的元素采用头尾指针。
  3. 若距离更小,更新距离与三个数之和。
  4. 否则,移动头指针或尾指针。

时间复杂度是,代码如下:

  1. class Solution {
  2. public:
  3. int threeSumClosest(vector<int>& nums, int target) {
  4. sort(nums.begin(), nums.end()); // 排序
  5. int distance = INT_MAX; // 记录距离
  6. int sum = nums[0]+nums[1]+nums[2]; // 记录和
  7. for(int i=0; i<nums.size()-2; ++i) { // 固定一个数字
  8. int l = i+1; // 头指针
  9. int r = nums.size()-1; // 尾指针
  10. while(l < r) {
  11. // 如果距离更近,则更新
  12. if(abs(nums[l]+nums[r]+nums[i]-target) < distance) {
  13. sum = nums[l]+nums[r]+nums[i];
  14. distance = abs(nums[l]+nums[r]+nums[i]-target);
  15. }
  16. if(nums[l]+nums[r]+nums[i] == target)
  17. return sum;
  18. else if(nums[l]+nums[r]+nums[i] < target)
  19. ++l;
  20. else
  21. --r;
  22. }
  23. }
  24. return sum;
  25. }
  26. };
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

AC 时间 20ms。





LeetCode答案源代码:https://github.com/SongLee24/LeetCode


转载于:https://www.cnblogs.com/songlee/p/5738051.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/520903
推荐阅读
相关标签
  

闽ICP备14008679号