您的位置:首页 > 其它

题目:三数之和 II

2015-08-22 00:46 337 查看
给一个包含n个整数的数组S, 找到和与给定整数target最接近的三元组,返回这三个数的和。

例如S = [-1, 2, 1, -4] and target = 1. 和最接近1的三元组是 -1 + 2 + 1 = 2.

注意

只需要返回三元组之和,无需返回三元组本身

标签 Expand

您在真实的面试中是否遇到过这个题?

Yes

样例

相关题目 Expand

思路:与三数之和的思路一致
public class Solution {
/**
* @param numbers: Give an array numbers of n integer
* @param target : An integer
* @return : return the sum of the three integers, the sum closest target.
*/
public int threeSumClosest(int[] numbers ,int target) {
// write your code here
if(null==numbers||0==numbers.length)  return Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
int dif = 0;
int res = 0;
//先排序,可以选择更加优秀的排序方式比如快排,合并等
for(int i=0;i<numbers.length;i++){
for(int j=i;j<numbers.length;j++){
if(numbers[i]>numbers[j]){
int tmp = numbers[i];
numbers[i] = numbers[j];
numbers[j] = tmp;
}
}
}
//a+b+c = 0 ; b+c = -a,就相当于求2者的和,用2个指针分别指向排序好的数组,需要去判断唯一性
//a,b,c 若与前一个元素的一致则跳过
for(int i=0;i<numbers.length;i++){
if(i>=1){
if(numbers[i] == numbers[i-1]){
continue;
}
}
int s = i+1;
int e = numbers.length-1;
while(s<e){
if(s>i+1&&numbers[s]==numbers[s-1]){
s++;
continue;
}
if(e<numbers.length-1&&numbers[e-1]==numbers[e]){
e--;
continue;
}
dif = numbers[s]+numbers[e]+numbers[i]-target;
if(min>Math.abs(dif)){
min = Math.abs(dif);
res = target+dif;
}
if(dif>0){
e--;
}else{
s++;
}
}
}
return res;

}
}



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: