在做本题之前可以先将leetcode15做一遍,两题有部分的思路相同,对解16题有所帮助。
思路部分:
本题也是寻找三数之和,那么我们的第一想法会联想到三层循环来解决。但是在15题的基础之上,我们可以通过定一变二来解决,就是固定first,动态变动second和third。
当nums[first]+nums[second]+nums[third]=target时,直接返回;
当nums[first]+nums[second]+nums[third]>target时,由于最初我们会对数组进行排序,所以此时需要third–;
当nums[first]+nums[second]+nums[third]<target时,second++。
代码部分:
class Solution {
public int threeSumClosest(int[] nums, int target) {
int min=Integer.MAX_VALUE;
int n=nums.length;
int value=0;
Arrays.sort(nums);
for(int first=0;first<n;first++){
if(first>0 && nums[first]==nums[first-1]){
continue;
}
int third=n-1;
int second=first+1;
while(second<third){
int res=nums[first]+nums[second]+nums[third];
if(res-target==0){
return res;
}
if(Math.abs(res-target)<min){
min=Math.abs(res-target);
value=res;
}
if(res>target){
third--;
}else{
second++;
}
}
}
return value;
}
}