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采取2pointer的做法,每次都判断现阶段所选数字合与target相比较。如果小于就result++。考虑到情况像{0,0,0,0,1,1,1,1} target 2,这种情况,所以每次不能简单end-start, 需要先排除重复项目。tricky part 在于我们得保持end-start至少为2.
public class Solution {
public int threeSumSmaller(int[] nums, int target) {
if(nums.length < 3){
return 0;
}
Arrays.sort(nums);
int result = 0;
for (int fix = 0; fix < nums.length-2; fix++){
if (fix != 0 && nums[fix] == nums[fix - 1]) continue;
int start = fix + 1;
int end = nums.length -1;
int diff = Integer.MAX_VALUE;
while(start < end){
diff = target - nums[fix] - nums[start] - nums[end];
if(diff > 0){
while(nums[end]==nums[end-2] && end - start >1){
end--;
}
while(nums[start]== nums[start+1] && end - start >1){
start++;
}
result += (end - start);
start++;
}
if(diff <= 0) {
end--;
}
}
}
System.out.print(""+result);
return result;
}
}