力扣16.最接近的三个数之和

题目: 传送门
分析: 题意要求找到三个数的和和target最接近,力扣15是找到三个数使得他们的和是0,两个题非常相似,只是一个和是确定的,一个是未知的,但是解决思路一样,就是三个数先确定a,然后找b、c,找b和c可以通过移动双指针,如果数组是有序的,那么确定两个指针,分别放到数组两端,他们的和就有了规律,如果两个指针的和比想要的大,我们可以移动右指针,如果小,我们可以移动左指针,这样,我们就可以找到我们需要的结果。
代码:

#include<iostream>
#include<vector>
#include<math.h>
#include<algorithm>
using namespace std;
class Solution {
    
    
public:
	int threeSumClosest(vector<int>& nums, int target) {
    
    
		sort(nums.begin(), nums.end());
		int ans=999999999;
		int n = nums.size();
		for (int i = 0; i < n - 2; i++) {
    
    
			int sum1, sum2;
			int j = i + 1, k = n - 1;
			sum1= nums[i] + nums[j] + nums[k];
			sum2 = sum1;
			if (abs(ans - target) > abs(sum1 - target)) {
    
    
				ans = sum1;
			}
			if (sum1 < target) {
    
    
				j++;
			}
			else if (sum1 == target) {
    
    
				return target;
			}
			else {
    
    
				k--;
			}
			while (j < k) {
    
    
				sum2 = nums[i] + nums[j] + nums[k];
				if (sum2 == target)
					return target;
				else if (sum2 < target) {
    
    
					j++;
				if (abs(sum2 - target) <abs(sum1 - target)) {
    
    
					sum1 = sum2;
					}
				}
				else {
    
    
					k--;
				    if (abs(sum2 - target) < abs(sum1 - target)) {
    
    
						sum1 = sum2;
					}
				}
			}
			if (abs(ans - target) > abs(sum1 - target)) {
    
    
				ans = sum1;
			}
			if (abs(ans - target) > abs(sum2 - target)) {
    
    
				ans = sum2;
			}

		}
		return ans;
	}
};

int main() {
    
    
	vector<int>nums;
	while (1) {
    
    
		int num;
		cin >> num;
		nums.push_back(num);
		if (cin.get() == '\n') {
    
    
			break;
		}
	}
	int t;
	cin >> t;
	Solution s;
	cout<<s.threeSumClosest(nums, t)<<endl;
}

Guess you like

Origin blog.csdn.net/qq_43840681/article/details/120912631