[Locked] 3Sum Smaller
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]
Follow up: Could you solve it in O(n^2) runtime?
分析:
1、暴力做法O(n^3)
2、如果题目是等于target,那么一种很直观的想法,对于nums中每个数,用target去减,然后问题就转换成了O(n)复杂度解决两数之和为target。
3、这题是小于target,用hash的方法复杂度为O(n^2*logn),若先排序,然后用夹逼的方法做复杂度可为O(n^2);
代码:
int tripletsNumber(vector<int> &nums, int target) { int count = 0; sort(nums.begin(), nums.end()); for(int i = 0; i < nums.size(); i++) { //从后面两个数的取值界限定为i,这样保证triplets不重复 int j = i + 1, k = int(nums.size()) - 1, newt = target - nums[i]; while(j < k) { if(nums[j] + nums[k] < newt) { count += k - j; j++; } else k--; } } return count; }