作者 : XiaXinyu
日期 :2021-10-08
题目
理解
这道题和15题很像,关键在于求与目标最接近的三个整数和
题解1(朴素做法)
这道题使用三层for循环是可以通过的,说明测试数据还是不够强大
class Solution{
public int threeSumClosest(int[] nums,int target){
int loss = Integer.MAX_VALUE;
int ans = 0;
int len = nums.length;
for(int i = 0;i < len - 2;i ++){ //枚举出所有三元组
for(int j = i + 1;j < len - 1;j ++)
for(int k = j + 1;k < len;k ++){
int sum = nums[i] + nums[j] + nums[k];
if(Math.abs(sum - target) < loss){
loss = Math.abs(sum - target); //更新最小差值
ans = sum; //更新答案
}
}
}
return ans;
}
}
时间复杂度
:O(n^3) 使用3层循环
空间复杂度
:O(1)
题解2(双指针)
与15题的思路是一样的
class Solution {
public int threeSumClosest(int[] nums, int target) {
int loss = Integer.MAX_VALUE;
int len = nums.length;
Arrays.sort(nums);
int ans = 0;
for(int i = 0;i < len - 2;i ++){
if(i > 1 && nums[i] == nums[i - 1]) continue;
for(int l = i + 1, r = len - 1;l < r; ){ //采用双指针算法寻找最接近target的三个整数和
int sum = nums[i] + nums[l] + nums[r];
if(sum < target) {
l ++;
if(Math.abs(sum - target) < loss){
ans = sum;
loss = Math.abs(sum - target);
}
}
else{
r --;
if(Math.abs(sum - target) < loss)
{
ans = sum;
loss = Math.abs(sum - target);
}
}
}
}
return ans;
}
}
时间复杂度
:O(n^2) 一层for循环结合双指针算法
空间复杂度
:O(1)