您的位置:首页 > 其它

Leetcode: 3Sum Closest

2014-10-09 04:47 429 查看
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很像,区别就是要维护一个最小的diff,求出和目标最近的三个和。brute force时间复杂度为O(n^3),优化的解法是使用排序之后夹逼的方法,总的时间复杂度为O(n^2+nlogn)=(n^2),空间复杂度是O(n)。

第二遍做法:

public class Solution {
public int threeSumClosest(int[] num, int target) {
if (num == null || num.length < 3) return 0;
Arrays.sort(num);
int minDiff = num[0] + num[1] + num[2] - target;
int diff = 0;
for (int i=num.length-1; i>=2; i--) {
if (i<num.length-1 && num[i]==num[i+1]) continue;
diff = twoSumClosest(num, 0, i-1, target-num[i]);
if (Math.abs(diff) < Math.abs(minDiff)) {
minDiff = diff;
}
}
return minDiff + target;
}

public int twoSumClosest(int[] num, int l, int r, int tar) {
int minDif = num[l] + num[r] - tar;
int dif = 0;
while (l < r) {
dif = num[l] + num[r] - tar;
if (dif == 0) return dif;
if (Math.abs(dif) < Math.abs(minDif)) {
minDif = dif;
}
if (dif < 0) {
l++;
}
else {
r--;
}
}
return minDif;
}
}


第一遍做法:

public class Solution {
public int threeSumClosest(int[] num, int target) {
if (num==null || num.length<3) {
return Integer.MIN_VALUE;
}
int res = num[0] + num[1] + num[2] - target;
Arrays.sort(num);
for (int i=num.length-1; i>=2; i--) {
int cur = twoSum(num, target-num[i], 0, i-1);
if (Math.abs(cur) < Math.abs(res)) {
res = cur;
}
}
return target+res;
}

public int twoSum(int[] num, int target, int l, int r) {
int closest = num[l] + num[r] - target;
while (l < r) {
if (num[l] + num[r] == target) {
return 0;
}
int diff = num[l] + num[r] - target;
if (Math.abs(diff) < Math.abs(closest)) {
closest = diff;
}
if (num[l] + num[r] > target) {
r--;
}
else {
l++;
}
}
return closest;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: