题目链接:3Sum Closest
Given an array S of n integers, find three integers in S such that the sum is closest to a given number, target. Return the sum of the three integers. You may assume that each input would have exactly one solution.
For example, given array S = {-1 2 1 -4}, and target = 1.
The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).
题意:给定数组中,找到和target最近的3个数字的和。
解题:这道题比3Sum要简单,主要是在于无需在意重复部分,所以可以设置一个min值,通过循环遍历比较min和 |sum-target|(绝对值),得到最后的结果。
代码实现:
class Solution {
public int threeSumClosest(int[] nums, int target) {
int len = nums.length;
if(len<3)
return -1;
int re = nums[0]+nums[1]+nums[2];
int min = Math.abs(re - target);
//最普通的三重循环遍历
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];
int temp = Math.abs(sum - target);
//当存在temp<min时,记录sum的值,改变min
if(temp < min ){
re = sum;
min = temp;
}
}
}
}
return re;
}
}
上述代码实现的时间复杂度为O(n^3),根据解决3Sum的指针的思路,同样可以降低时间复杂度到O(n^2)。
代码实现如下:
class Solution {
public int threeSumClosest(int[] nums, int target) {
int len = nums.length;
if(len<3)
return -1;
//同样要首先新对数组进行排序
Arrays.sort(nums);
int re = nums[0]+nums[1]+nums[2];
int min = Math.abs(re - target);
int j = 0, k = 0;
for(int i = 0; i<len-2;i++){
j = i+1;
k = len-1;
while(j < k){
int sum = nums[i] + nums[j] + nums[k];
int temp = Math.abs(sum - target);
//如果temp==0了,即sum==target,直接返回sum即可,无需继续进行
if(temp == 0){
return sum;
}
if(temp < min){
re = sum;
min = temp;
}
if(sum > target){
k--;
}else
j++;
}
}
return re;
}
}