1. 程式人生 > >【LeetCode】16. 3Sum Closest(C++)

【LeetCode】16. 3Sum Closest(C++)

題目:

Given an array nums of n integers and an integer target, find three integers in nums such that the sum is closest to target. Return the sum of the three integers. You may assume that each input would have exactly one solution.

Example:
在這裡插入圖片描述

理解:

和剛才的3sum好像,只是這裡不再是和為0,而是最接近target,其實是一樣的思路。還是排序以後,既可以跳過重複值,又可以方便雙指標進行移動。如果和大於target,可以把右指標左移;如果小於可以把左指標右移。

實現:

class Solution {
public:
	int threeSumClosest(vector<int>& nums, int target) {
		int closest = nums[0]+nums[1]+nums[2];
		sort(nums.begin(), nums.end());
		for (int i = 0; i < nums.size(); ++i) {
			int l = i + 1, r = nums.size() - 1;
			while (l < r) {
				int sum = nums[i] + nums[l] + nums[r];
				if (sum == target) return target;
				if (abs(sum - target) < abs(closest - target)) {
					closest = sum;
				}
				if (sum < target) {
					int left = nums[l];
					while (l < r&&nums[l] == left) ++l;
				}
				else if (sum > target) {
					int right = nums[r];
					while (l < r&&nums[r] == right) --r;
				}				
			}
			while (i + 1 < nums.size() && nums[i + 1] == nums[i])
				++i;
		}
		return closest;
	}
};