Given an array of n integers nums and a target, find the number of index triplets i, j, k with 0 <= i < j < k < n that satisfy the condition nums[i] + nums[j] + nums[k] < target.
For example, given nums = [-2, 0, 1, 3], and target = 2.
Return 2. Because there are two triplets which sums are less than 2:
[-2, 0, 1] [-2, 0, 3] Follow up: Could you solve it in O(n2) runtime?
Solution
public class Solution {
public int threeSumSmaller(int[] nums, int target) {
if(nums.length < 3) return 0;
Arrays.sort(nums);
int cnt = 0;
for(int i = 0; i < nums.length-2; i++) {
int j = i+1;
int k = nums.length-1;
while(j < k) {
while(j < k && nums[j] + nums[k] < target - nums[i]) j++;
if(j != k) {
cnt += j - i - 1;
k--;
}
}
// k == j
if(k - i >= 2) cnt += (k - i) * (k - i - 1) / 2;
}
return cnt;
}
}