一 题目
Given an array nums
of n integers and an integer target
, find three integers in nums
such that the sum is closest to target
. Return the sum of the three integers. You may assume that each input would have exactly one solution.
Example:
Given array nums = [-1, 2, 1, -4], and target = 1. The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).
二 分析
求最接近target的三数之和。这个题目是medium级别。 在上一道题的leetcode 15. 3Sum 很类似,解题思路也是一样。
就是先排序,在用滑动窗口往中间处理的模式。
区别:不用考虑重复情况,因为要接近,所以需要使用diff变量来保存sum与target 的差,注意 可能为负所以取了绝对值。
逻辑比较清晰,所以不多介绍了。
public static void main(String[] args) {
int[] nums2 = {1,2,4,8,16,32,64,128};
System.out.println( threeSumClosest(nums2,82)) ;
int[] nums = {1,1,1,0};
System.out.println( threeSumClosest(nums,-100)) ;
int[] nums1 = {-1, 2, 1, -4};
System.out.println( threeSumClosest(nums1,1)) ;
}
public static int threeSumClosest(int[] nums, int target) {
int res =0;
if (nums.length < 3) return res;
//先排序
Arrays.sort(nums);
int tmp = Integer.MAX_VALUE;
for(int i=0;i<= nums.length-3;i++){
int left = i+1;
int right = nums.length-1;
while(left< right){
int sum = nums[i]+nums[left]+nums[right] ;
if(sum == target){
return target;
}
int diff = Math.abs(sum -target);
if(diff< tmp){
tmp = diff;
res = sum;
}
else if(sum>target){
right --;
}else if(sum<target){
left++;
}
}
}
return res;
}
Runtime: 4 ms, faster than 95.86% of Java online submissions for 3Sum Closest.
Memory Usage: 36.3 MB, less than 100.00% of Java online submissions for 3Sum Closest.
这个时间复杂度也是O(N^2)的。