|
| 1 | +/** |
| 2 | + * 2563. Count the Number of Fair Pairs |
| 3 | + * https://leetcode.com/problems/count-the-number-of-fair-pairs/ |
| 4 | + * Difficulty: Medium |
| 5 | + * |
| 6 | + * Given a 0-indexed integer array nums of size n and two integers lower and upper, return the |
| 7 | + * number of fair pairs. |
| 8 | + * |
| 9 | + * A pair (i, j) is fair if: |
| 10 | + * - 0 <= i < j < n, and |
| 11 | + * - lower <= nums[i] + nums[j] <= upper |
| 12 | + */ |
| 13 | + |
| 14 | +/** |
| 15 | + * @param {number[]} nums |
| 16 | + * @param {number} lower |
| 17 | + * @param {number} upper |
| 18 | + * @return {number} |
| 19 | + */ |
| 20 | +var countFairPairs = function(nums, lower, upper) { |
| 21 | + let result = 0; |
| 22 | + |
| 23 | + nums.sort((a, b) => a - b); |
| 24 | + |
| 25 | + for (let i = 0; i < nums.length - 1; i++) { |
| 26 | + const minTarget = lower - nums[i]; |
| 27 | + const maxTarget = upper - nums[i]; |
| 28 | + |
| 29 | + const first = findFirstValidIndex(i + 1, minTarget); |
| 30 | + const last = findFirstValidIndex(i + 1, maxTarget + 1) - 1; |
| 31 | + |
| 32 | + if (first <= last) { |
| 33 | + result += last - first + 1; |
| 34 | + } |
| 35 | + } |
| 36 | + |
| 37 | + return result; |
| 38 | + |
| 39 | + function findFirstValidIndex(start, target) { |
| 40 | + let left = start; |
| 41 | + let right = nums.length - 1; |
| 42 | + let index = nums.length; |
| 43 | + |
| 44 | + while (left <= right) { |
| 45 | + const mid = Math.floor((left + right) / 2); |
| 46 | + if (nums[mid] >= target) { |
| 47 | + index = mid; |
| 48 | + right = mid - 1; |
| 49 | + } else { |
| 50 | + left = mid + 1; |
| 51 | + } |
| 52 | + } |
| 53 | + |
| 54 | + return index; |
| 55 | + } |
| 56 | +}; |
0 commit comments