# LeetCode 2563. Count the Number of Fair Pairs https://leetcode.com/problems/count-the-number-of-fair-pairs/description/ ## 題目大意 給定整數陣列 `nums` 以及兩整數 `lower` 跟 `upper` 定義 `(i, j)` 為 fair pair 若且唯若: 1. $0\le i\lt j\lt\text{nums.length}$ 2. $\text{lower}\le \text{nums}\left[ i \right] + \text{nums}\left[ j \right]\le\text{upper}$ ## 思考 這題有個小關鍵就是 `nums[i] + nums[j] == nums[j] + nums[i]` 這件事 換句話說,我們的檢查條件可以從 `i < j` 變成 `i != j` 我們可以放心對 `nums` 做排序 假設我們知道所有總和不超過 `upper` 的 pair 數,將其扣除不超過 `lower - 1` 的 pair 數,即為所求 C++ 參考解答: ```cpp! class Solution { public: long long countFairPairs(vector<int> &nums, int lower, int upper) { sort(nums.begin(), nums.end()); return countNotGreater(nums, upper) - countNotGreater(nums, lower - 1); } private: long long countNotGreater(const vector<int> &nums, int target) { long long ans = 0; for (auto begin = nums.begin(), end = prev(nums.end()); begin < end; ++begin) { while (begin < end && *begin + *end > target) --end; ans += end - begin; } return ans; } }; ``` Go 參考解答: ```go! func countFairPairs(nums []int, lower int, upper int) int64 { sort.Ints(nums) return countNotGreater(nums, upper) - countNotGreater(nums, lower-1) } func countNotGreater(nums []int, target int) (ans int64) { start, end := 0, len(nums)-1 for start < end { if nums[start]+nums[end] > target { end-- } else { ans += int64(end - start) start++ } } return } ```