题目:
Given an array of n integers nums and a target, find the number of index tripletsi, j, k
with 0 <= i < j < k < n
that satisfy the conditionnums[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(n2) runtime?
一步一步由O(n3)到O(n2)。
class Solution { public: int threeSumSmaller(vector<int>& nums, int target) { sort(nums.begin(), nums.end()); int k = nums.size() - 2; int count = 0; for(int i = 0; i < k; i++) { for(int j = i + 1; j < k + 1; j++) { for(int t = j + 1; t < k + 2; t++) { if(nums[i] + nums[j] + nums[t] < target) { count++; } else { break; } } } } return count; } };
class Solution { public: int threeSumSmaller(vector<int>& nums, int target) { sort(nums.begin(), nums.end()); int k = nums.size() - 2; int count = 0; for(int i = 0; i < k; i++) { for(int j = i + 1; j < k + 1; j++) { int end = nums.size() - 1; int t = target - nums[i] - nums[j]; while(end > j && nums[end] >= t) end--; count += ((end > j) ? (end - j) : 0); } } return count; } };
class Solution { public: int threeSumSmaller(vector<int>& nums, int target) { sort(nums.begin(), nums.end()); int k = nums.size() - 2; int count = 0; for(int i = 0; i < k; i++) { int begin = i + 1; int end = k + 1; int t = target - nums[i]; while(begin < end) { if(nums[begin] + nums[end] >= t) { end--; } else { count += end - begin; begin++; } } } return count; } };