Given an integer array nums, return the number of triplets chosen from the array that can make triangles if we take them as side lengths of a triangle.
Example 1:
1 2 3 4 5 6
Input: nums = [2,2,3,4] Output: 3 Explanation: Valid combinations are: 2,3,4 (using the first 2) 2,3,4 (using the second 2) 2,2,3
classSolution { public: inttriangleNumber(vector<int>& nums){ // triangle: a + b > c ranges::sort(nums); int res = 0; for (int i = 0; i < nums.size(); i++) { // if (i && nums[i] == nums[i - 1]) continue; for (int j = i + 1; j < nums.size(); j++) { // if (j > i + 1 && nums[j] == nums[j - 1]) continue; // now we need to find the max index with nums[k] < nums[i] + nums[j] // range of k: [j + 1, num.size() - 1] int left = j, right = nums.size(), target = nums[i] + nums[j]; while (left + 1 < right) { int mid = (left + right) / 2; if (nums[mid] >= target) { right = mid; } else { left = mid; } } // so all right has value >= target, right can be at j + 1 res += right - j - 1; } } return res; } };