随笔 - 118  文章 - 0  评论 - 0  阅读 - 24197

力扣16.最接近的三数之和(双指针)

给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。

返回这三个数的和。

假定每组输入只存在恰好一个解。

 

示例 1:

输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。

 

示例 2:

输入:nums = [0,0,0], target = 1
输出:0

 

 

提示:

  • 3 <= nums.length <= 1000
  • -1000 <= nums[i] <= 1000
  • -104 <= target <= 104

1.暴力+剪枝(刚好不超时1000~1500ms),剪枝的主要内容是:a.第三层循环从尾部开始遍历,当这次的差值(current_difference)大于上次的差值(previous_difference)时,就可以停止第三层循环的遍历了,因为再往左走差值只会越来越大。b.前两层的遍历过程中,可以跳过相同元素。

复制代码
 1 class Solution {
 2 public:
 3     int threeSumClosest(vector<int>& nums, int target) {
 4         sort(nums.begin(),nums.end());
 5         int similarity; //记录最相似的值
 6         int minimum_difference=INT32_MAX; //记录最小差值
 7         for (int i=0;i<nums.size()-2;i++){
 8             if (i>0&&nums[i]==nums[i-1])
 9                 continue;
10             int goal=target-nums[i];
11             for (int left=i+1;left<nums.size()-1;++left){
12                 if (left>i+1&&nums[left]==nums[left-1])
13                     continue;
14                 int previous_difference=INT32_MAX; //记录上一次遍历的差值
15                 int current_difference; //记录当前差值
16                 for (int right=nums.size()-1;right>left;right--){
17                     current_difference=abs(goal-nums[left]-nums[right]);
18                     if (current_difference>previous_difference)
19                         break;
20                     if (current_difference<=minimum_difference){
21                         minimum_difference=abs(goal-nums[left]-nums[right]);
22                         similarity=nums[i]+nums[left]+nums[right];
23                     }
24                     if (minimum_difference==0){
25                         return target;
26                     }
27                     previous_difference=current_difference;
28                 }
29             }
30         }
31         return similarity;
32     }
33 };
复制代码

 2.双指针

复制代码
 1 class Solution
 2 {
 3 public:
 4     int threeSumClosest(vector<int> &nums, int target)
 5     {
 6         sort(nums.begin(), nums.end());
 7         int similarity;                     // 记录最相似的值
 8         int minimum_difference = INT32_MAX; // 记录最小差值
 9         for (int i = 0; i < nums.size(); ++i)
10         {
11             int left = i + 1, right = nums.size() - 1;
12             while (left < right)
13             {
14                 int sum = nums[i] + nums[left] + nums[right];
15                 if (abs(sum - target) < minimum_difference)
16                 {
17                     minimum_difference = abs(sum - target);
18                     similarity = sum;
19                 }
20                 if (sum == target)
21                     return target;
22                 else if (sum > target)
23                     right--;
24                 else
25                     left++;
26             }
27         }
28         return similarity;
29     }
30 };
复制代码

 

posted on   Coder何  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
历史上的今天:
2022-09-26 Hashing (25)
< 2025年3月 >
23 24 25 26 27 28 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 31 1 2 3 4 5

点击右上角即可分享
微信分享提示