题目地址
题目分析
这个题和三数之和很相似,所以我采用了相同的做法,先进行排序,每次固定左手边的值。然后使用双指针从左边和右边寻找三数之和最接近target的值,这样做的效率有点差,两个月过去了水平还没啥提升,我醉了。
实现代码
class Solution {
public int threeSumClosest(int[] nums, int target) {
//先进行排序,即对数据进行预处理。
Arrays.sort(nums);
int index = 0;
//返回值
int res = Integer.MAX_VALUE;
//为什么要小于nums.length - 2呢?主要是为了防止出现刚好三个数的情况。
while(index < nums.length - 2){
//注意,这里左指针不需要取和index不重复的值。
int left = index + 1;
int right = nums.length - 1;
//双指针进行判断。
while(left < right){
int temp = nums[left] + nums[right] + nums[index];
//如果res还是默认值或者temp和target之差的绝对值要比res之差的绝对值小,则更新新的值。
if(res == Integer.MAX_VALUE || (Math.abs(temp - target) < Math.abs(res - target))){
res = temp;
}
//如果temp比目标值大,我们右指针向左寻找第一个与原来的值不等的数字。
if(temp >= target){
int curVal = nums[right];
while(right > left && nums[right] == curVal){
right--;
}
}else{
//比目标值小的情况下同理。
int curVal = nums[left];
while ((left < right && nums[left] == curVal)){
left++;
}
}
}
//这里是将左手边固定值寻找下一个不等的数字。
int curVal = nums[index];
while(index < nums.length-2 && nums[index] == curVal){
index++;
}
}
return res;
}
}
总结
自己真菜!
更新
在提交完这次答案后,才看到题目中说只存在一个值,那么当我们寻找到与target相等的值,就可以直接返回不需要更多的判断了!!
class Solution {
public int threeSumClosest(int[] nums, int target) {
//先进行排序,即对数据进行预处理。
Arrays.sort(nums);
int index = 0;
//返回值
int res = Integer.MAX_VALUE;
//为什么要小于nums.length - 2呢?主要是为了防止出现刚好三个数的情况。
while(index < nums.length - 2){
//注意,这里左指针不需要取和index不重复的值。
int left = index + 1;
int right = nums.length - 1;
//双指针进行判断。
while(left < right){
int temp = nums[left] + nums[right] + nums[index];
//如果res还是默认值或者temp和target之差的绝对值要比res之差的绝对值小,则更新新的值。
if(res == Integer.MAX_VALUE || (Math.abs(temp - target) < Math.abs(res - target))){
res = temp;
}
//加快运行速率!!!!!
if(temp == target){
return temp;
}
//如果temp比目标值大,我们右指针向左寻找第一个与原来的值不等的数字。
else if(temp > target){
int curVal = nums[right];
while(right > left && nums[right] == curVal){
right--;
}
}else{
//比目标值小的情况下同理。
int curVal = nums[left];
while ((left < right && nums[left] == curVal)){
left++;
}
}
}
//这里是将左手边固定值寻找下一个不等的数字。
int curVal = nums[index];
while(index < nums.length-2 && nums[index] == curVal){
index++;
}
}
return res;
}
}