您的位置:首页 > 其它

16. 3Sum Closest

2017-02-18 06:44 295 查看
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 smallest类似,O(n^2)的复杂度。第一个数从0开始向后遍历,在这期间第二个数初始化为i + 1,第三个数初始化为length - 1。如果三个数的和大于target,high--,如果小于,low++。比较现在的和跟之前的和是不是更接近target,更接近的话替换之前的和。代码如下:
public class Solution {
public int threeSumClosest(int[] nums, int target) {
Arrays.sort(nums);
int min = Integer.MAX_VALUE;
int res = 0;
for (int i = 0; i < nums.length; i ++) {
int low = i + 1, high = nums.length - 1, sum = target - nums[i];
while (low < high) {
if (min > Math.abs(nums[low] + nums[high] - sum)) {
res = nums[low] + nums[high] + nums[i];
min = Math.abs(nums[low] + nums[high] - sum);
}
if (nums[low] + nums[high] == sum) {
return target;
} else if (nums[low] + nums[high] < sum) {
low ++;
} else {
high --;
while (low + 1 < high && nums[high] == nums[high + 1]) high --;
}
}
}
return res;
}
}上面算法用的是差来比较是不是更接近,也可以用存储和的形式来判断是不是更接近,代码如下:
public class Solution {
public int threeSumClosest(int[] num, int target) {
int result = num[0] + num[1] + num[num.length - 1];
Arrays.sort(num);
for (int i = 0; i < num.length - 2; i++) {
int start = i + 1, end = num.length - 1;
while (start < end) {
int sum = num[i] + num[start] + num[end];
if (sum > target) {
end--;
} else {
start++;
}
if (Math.abs(sum - target) < Math.abs(result - target)) {
result = sum;
}
}
}
return result;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: