题目:最接近的三数之和
描述:给定一个包括 n 个整数的数组 S,找出 S 中的三个整数使得他们的和与给定的数 target 最接近。返回这三个数的和。假定每组输入只存在一个答案。
例如,给定数组 S = {-1 2 1 -4}, 并且 target = 1. 与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
给定一个包括 n 个整数的数组 S,找出 S 中的三个整数使得他们的和与给定的数 target 最接近。返回这三个数的和。假定每组输入只存在一个答案。
例如,给定数组 S = {-1 2 1 -4}, 并且 target = 1. 与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
思路一:不考虑任何优化的情况,三层循环,时间复杂度O(n^3)
思路二:先将数组升序,三个下标,i为外层循环下标,lo=i+1,hi=nums.length-1,内层循环中根据三数之和与target比较改变下标lo和hi。
实现:
//时间复杂度O(n^3)
class Solution {
public int threeSumClosest(int[] nums, int target) {
int len = nums.length - 1;
int min = nums[0]+nums[1]+nums[2];
//Arrays.sort(nums);
for(int i=0;i<len-1;i++)
for(int j=i+1;j<len;j++)
for(int k=j+1;k<len+1;k++){
int sum = nums[i]+nums[j]+nums[k];
if(Math.abs(min-target)>Math.abs(sum-target))
min = sum;
}
return min;
}
}
//时间复杂度O(n^2)
class Solution {
public int threeSumClosest(int[] nums, int target) {
int len = nums.length - 1;
int min = nums[0]+nums[1]+nums[2];
Arrays.sort(nums);
for(int i=0;i<len-1;i++){
int lo = i+1,hi = len;
while(lo<hi){
int sum = nums[i]+nums[lo]+nums[hi];
if(sum >target)
hi--;
else
lo++;
if(Math.abs(min-target)>Math.abs(sum-target)){
min = sum;
}
}
}
return min;
}
}