259. 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系列问题,整体思路还是先排序,然后夹逼方式检索,选定i和j
后,当nums[i] + nums[j] + nums[k] < target
时,则nums[k,k-1...,j+1]
都满足要求,即有k-j
个组合符合要求,当nums[i] + nums[j] + nums[k] >= target
时,减小k值继续检索
源码
class Solution {
public:
int threeSumSmaller(vector<int>& nums, int target) {
int count = 0;
sort(nums.begin(), nums.end());
for(int i = 0; i < nums.size() - 2; i++) {
int j = i + 1, k = nums.size() - 1;
while(j < k) {
int sum = nums[i] + nums[j] + nums[k];
if(sum >= target) k--;
else {
count += (k - j);//k,k-1...,j+1
j++;
}
}
}
return count;
}
}