您的位置:首页 > 其它

LeetCode - 3Sum Closest

2017-03-23 21:10 239 查看

题目

  输入一个数组和一个目标值target,返回数组中任意3个数的和最接近target的值。

思路

  和 3Sum 类似,每次先确定一个数的值,然后计算选出来的两个数和当前确定的数的和,进行比较,如果和目标值相同,则返回目标值,否则选取更接近的值作为结果值。继续计算,知道找到和目标值相同的值或者计算完毕。

代码

public int threeSumClosest(int[] nums, int target) {
int res = 0;
if (nums == null || nums.length < 3) {
return res;
}
ArrayList<Integer> list = new ArrayList<>();
f
4000
or (int i : nums) {
list.add(i);
}
Collections.sort(list);
// 初始化res为前三个数之和
res = list.get(0) + list.get(1) + list.get(2);
for (int i = 0 ; i < nums.length - 2 ;) {
// 当前计算的3个数的和
int sum = 0;
// 从i后一个结点开始查找
int left = i + 1;
int right = nums.length - 1;
while (left < right) {
sum = list.get(i) + list.get(left) + list.get(right);
// 如果当前3个数的值更接近target
if (Math.abs(sum - target) < Math.abs(res - target)) {
res = sum;
}
// 如果找到的和目标相等,直接返回
if (sum == target) {
return target;
} else if (sum < target) {
int num = list.get(left);
while (num == list.get(left) && left < right) {
left++;
}
} else {
int num = list.get(right);
while (num == list.get(right) && right > left) {
right--;
}
}
}
// 跳过重复的
int num = list.get(i);
// 注意判断顺序,如果颠倒了会抛出异常,应该先判断是否越界
while (i < nums.length && list.get(i) == num) {
i++;
}
}
return res;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode