3Sum Smaller

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:

  1. [-2, 0, 1]
  2. [-2, 0, 3]

Follow up:

Could you solve it in O(n^2) runtime?

Solution:

  1. public class Solution {
  2. public int threeSumSmaller(int[] nums, int target) {
  3. Arrays.sort(nums);
  4. int n = nums.length, count = 0;
  5. for (int i = 0; i < n - 2; i++) {
  6. int j = i + 1, k = n - 1;
  7. while (j < k) {
  8. int sum = nums[i] + nums[j] + nums[k];
  9. if (sum >= target) {
  10. k--;
  11. } else {
  12. count += k - j;
  13. j++;
  14. }
  15. }
  16. }
  17. return count;
  18. }
  19. }

Time complexity: O(n^2)