1、题目
2、思路
本质上还是左右指针夹逼,外层循环表示三个数中其中一个数。首先数组排序,内层定义两个指针分别指向头和尾。
可以分为两种情况。一是比目标值大,直接让nums[k]减小。二是比目标值小,尝试让nums[j]增大,直到三数之和大于目标值,再让k--,把j放回原来的位置。
3、代码
public int threeSumSmaller(int[] nums, int target) {
int count = 0;
int n = nums.length;
Arrays.sort(nums);
for (int i = 0; i < n; i++) {
int j = i + 1, k = n - 1;
while (j < k) {
// 分两种情况: 比目标值小,比目标值大
while (j < k && nums[i] + nums[j] + nums[k] < target) {
// 比目标值小,让k不动,尝试去增大j,直到sum>0,让j回到原来的地方,k--
// 如果比目标值大,直接让k--
j++;
count++;
}
j = i + 1;
k--;
}
}
return count;
}