16、最接近的三数之和

和第15题有点像,故还是用双指针+排序。
细节:先假设最接近target的数就是nums[0] + nums[1] + nums[2] 之后在进行比较:Math.abs(threeSum - target) < Math.abs(closestNum - target)
如果threeSum > target,r就要减1、因为数组是排序的,如果 left不变而 right向右移动,就永远不能靠近target了。同理threeSum < target
class Solution {
public int threeSumClosest(int[] nums, int target) {
Arrays.sort(nums);
//最接近:|sum-target|最小
int ans=nums[0]+nums[1]+nums[2];
for(int i=0;i<nums.length;i++){
int left=i+1;
int right=nums.length-1;
while(left<right){
int sum=nums[i]+nums[left]+nums[right];
//判断
if(Math.abs(sum-target)<Math.abs(ans-target)){
ans=sum;
}
if(sum>target){
right--;
}else if(sum<target){
left++;
}else{
return sum;
}
}
}
return ans;
}
}
2万+

被折叠的 条评论
为什么被折叠?



