LeetCode16. 最接近的三数之和

题目

分析

和LeetCode15题差不多的思路,可以暴力搜索,但是时间复杂度太高,考虑用双指针降低时间复杂度

也和LeetCode 11题差不多思路

https://leetcode-cn.com/problems/3sum-closest/solution/zui-jie-jin-de-san-shu-zhi-he-by-leetcode-solution/

代码

 1 class Solution {
 2 public:
 3     int threeSumClosest(vector<int>& nums, int target) {
 4         //定义一下答案,因为要保存差值和答案,所以采用pair
 5         pair<int,int>res(INT_MAX,INT_MAX);
 6 
 7         sort(nums.begin(),nums.end());
 8 
 9         for(int i = 0;i < nums.size();i++){
10             for(int j = i + 1,k = nums.size()-1;j < k;j++){
11                 //试探法,k-1 不与 j 重复 并且 三数之和 依旧 大于等于 target ,k 就可以移动到 k-1的位置上
12                 //这一步的目的就是找到 最小的 k 使得 nums[i] + nums[j] + nums[k] >= target 
13                 //那么nunms[i] + nums[j] + nums[k-1] < target 
14                 while(j < k-1 && nums[i] + nums[j] + nums[k - 1] >= target) k--;
15                 int sum = nums[i] + nums[j] + nums[k];
16                 res = min(res,make_pair(abs(sum - target),sum)); //这里要加绝对值,因为未必可以找到k 使得大于 target
17 
18                 if(k - 1 > j){
19                     sum = nums[i] + nums[j] + nums[k-1];
20                     res = min(res,make_pair(target - sum,sum));
21                 }
22             }
23         }
24 
25         return res.second;
26     }
27 };

 

另一种实现方式,自己

 1 class Solution {
 2 public:
 3     int threeSumClosest(vector<int>& nums, int target) {
 4         //定义一下答案,因为要保存差值和答案,所以采用pair
 5         pair<int,int>res(INT_MAX,INT_MAX);
 6 
 7         sort(nums.begin(),nums.end());
 8 
 9         for(int i = 0;i < nums.size();i++){
10             int j = i + 1,k = nums.size() - 1;
11             while(j < k){
12                 int sum = nums[i] + nums[j] +nums[k];
13                 if(sum > target) {
14                     res = min(res,make_pair((sum - target),sum));
15                     k--;
16                 }
17                 else if(sum < target){
18                     res = min(res,make_pair((target - sum),sum));
19                     j++;
20                 }
21                 else {
22                     return target;
23                 } 
24             }
25         }
26 
27         return res.second;
28     }
29 };

 

posted @ 2022-03-17 14:47  Uitachi  阅读(19)  评论(0编辑  收藏  举报