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 };