Fork me on GitHub

16. 3Sum Closest

16. 3Sum Closest

题目

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

    For example, given array S = {-1 2 1 -4}, and target = 1.

    The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).

解析


// three sum closest
class Solution_16 {
public:
	// 三个指针操作O(N^2) test=([0,2,1,-3] 1);([1,1,-1,-1,3]-1)
	int threeSumClosest(vector<int>& nums, int target) {
		if (nums.size() < 3)
		{
			return 0;
		}

		int closest_sum = nums[0] + nums[1] + nums[2];
		sort(nums.begin(), nums.end());
		for (int first = 0; first < nums.size() - 2; first++)
		{
			if (first > 0 && nums[first] == nums[first - 1])
			{
				continue;
			}
			int second = first + 1;
			int end = nums.size() - 1;
			while (second<end)
			{
				int temp = nums[first] + nums[second] + nums[end];

				if (abs(closest_sum - target)>abs(temp - target))
				{
					closest_sum = temp;
				}
				if (temp == target)
				{
					return temp;
				}
				else if (temp < target)
				{
					second++;
				}
				else
				{
					end--;
				}
			}
		}
		return closest_sum;
	}

	// 暴力O(n^3)
	int threeSumClosest_1(vector<int> &num, int target)
	{
		int res = num[0] + num[1] + num[2];
		for (int i = 0; i < num.size() - 2; i++){
			for (int j = i + 1; j < num.size() - 1; j++){
				for (int t = j + 1; t < num.size(); t++){
					int tem = num[i] + num[j] + num[t];
					if (abs(target - tem) < abs(target - res))
						res = tem;
					if (res == target)
						return res;
				}
			}
		}
		return res;
	}
};


题目来源

posted @ 2018-01-20 22:42  ranjiewen  阅读(180)  评论(0编辑  收藏  举报