如果用暴力要扫描三次,O(n^3)
双指针扫描,扫一次时间复杂度为O(n),外层一个循环,所以时间复杂度为O(n^2),感觉有点折半查找的意思。
class Solution {
public int threeSumClosest(int[] nums, int target) {
Arrays.sort(nums);
int ans = nums[0] + nums[1] + nums[2]; //数组长度应该大于3吧
for (int i = 0; i < nums.length; i++) {
int left = i + 1;
int right = nums.length - 1;
while(left < right) {
System.out.println("i=" + i + " left=" + left + " right=" + right);
int sum = nums[left] + nums[right] + nums[i];
if(Math.abs(target - sum) < Math.abs(target - ans))
ans = sum;
if(sum < target) { //作比较的是sum,而不是ans
left ++ ;
}else if(sum > target) {
right -- ;
}else {
return ans;
}
}
}
return ans;
}
}