题目链接:https://leetcode.com/problems/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).
解题思路:
这题的做法与 3Sum 很类似。依然是转化为 2Sum 的子问题。
不同之处在于,这道题需要维护一个全局最优解,每次循环获得的局部最优解都要和全局最优解进行比较,将最接近的值用于更新全局最优解。
由于这次只要求返回最接近的和,而非三个元素组成的序列,所以将 3Sum 解答的两个函数合并为一。
3Sum 详细解答
public class Solution {
public int threeSumClosest(int[] nums, int target) {
if(nums == null || nums.length < 2)
return Integer.MIN_VALUE;
Arrays.sort(nums);
int closest = nums[0] + nums[1] + nums[2];
for(int i = nums.length - 1; i >= 2; i --) {
int start = 0;
int end = i - 1;
while(start < end) {
int sum = nums[start] + nums[end] + nums[i];
if(Math.abs(sum - target) < Math.abs(closest - target))
closest = sum;
if(sum < target)
start ++;
else if(sum > target)
end --;
else
return closest;
}
}
return closest;
}
}
120 / 120 test cases passed.
Status: Accepted
Runtime: 324 ms