力扣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 };
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
2022-09-26 Hashing (25)