原题链接在这里:https://leetcode.com/problems/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:
[-2, 0, 1] [-2, 0, 3]
题解:
与3Sum类似. 计算和小于target的组合个数,重复的也要算. 若是nums[i] + nums[j] + nums[k] 符合要求,那么count += k-j, j++. 举例{-2, 0, 1, 3}. target = 4. {-2, 0, 3}符合要求, {-2, 0, 1}也符合要求,一次加上两个.
若是不符合要求说明等于或者大于target了, k--.
Time Complexity: O(n^2). Space: O(1).
AC Java:
1 public class Solution { 2 public int threeSumSmaller(int[] nums, int target) { 3 if(nums == null || nums.length == 0){ 4 return 0; 5 } 6 Arrays.sort(nums); 7 int count = 0; 8 for(int i = 0; i<nums.length-2; i++){ 9 int j = i+1; 10 int k = nums.length-1; 11 while(j<k){ 12 if(nums[i] + nums[j] + nums[k] >= target){ 13 k--; 14 }else{ 15 count += k-j; 16 j++; 17 } 18 } 19 } 20 return count; 21 } 22 }