class Solution {
public:
long long countFairPairs(vector<int>& nums, int lower, int upper) {
}
};
6355. 统计公平数对的数目
给你一个下标从 0 开始、长度为 n
的整数数组 nums
,和两个整数 lower
和 upper
,返回 公平数对的数目 。
如果 (i, j)
数对满足以下情况,则认为它是一个 公平数对 :
0 <= i < j < n
,且lower <= nums[i] + nums[j] <= upper
示例 1:
输入:nums = [0,1,7,4,4,5], lower = 3, upper = 6 输出:6 解释:共计 6 个公平数对:(0,3)、(0,4)、(0,5)、(1,3)、(1,4) 和 (1,5) 。
示例 2:
输入:nums = [1,7,9,2,5], lower = 11, upper = 11 输出:1 解释:只有单个公平数对:(2,3) 。
提示:
1 <= nums.length <= 105
nums.length == n
-109 <= nums[i] <= 109
-109 <= lower <= upper <= 109
原站题解
golang 解法, 执行用时: 152 ms, 内存消耗: 9.5 MB, 提交时间: 2023-02-13 10:34:48
func countFairPairs(nums []int, lower, upper int) (ans int64) { sort.Ints(nums) for j, x := range nums { r := sort.SearchInts(nums[:j], upper-x+1) l := sort.SearchInts(nums[:j], lower-x) ans += int64(r - l) } return }
cpp 解法, 执行用时: 240 ms, 内存消耗: 52.4 MB, 提交时间: 2023-02-13 10:34:32
class Solution { public: long long countFairPairs(vector<int> &nums, int lower, int upper) { long long ans = 0; sort(nums.begin(), nums.end()); for (int j = 0; j < nums.size(); ++j) { auto r = upper_bound(nums.begin(), nums.begin() + j, upper - nums[j]); auto l = lower_bound(nums.begin(), nums.begin() + j, lower - nums[j]); ans += r - l; } return ans; } };
java 解法, 执行用时: 52 ms, 内存消耗: 59.5 MB, 提交时间: 2023-02-13 10:34:15
class Solution { private final static int[] NOT_FOUND = new int[]{-1, -1}; public long countFairPairs(int[] nums, int lower, int upper) { long ans = 0; Arrays.sort(nums); for (int j = 0; j < nums.length; ++j) { int r = lowerBound(nums, j, upper - nums[j] + 1); int l = lowerBound(nums, j, lower - nums[j]); ans += r - l; } return ans; } // 见 https://www.bilibili.com/video/BV1AP41137w7/ private int lowerBound(int[] nums, int right, int target) { int left = -1; // 开区间 (left, right) while (left + 1 < right) { // 区间不为空 // 循环不变量: // nums[left] < target // nums[right] >= target int mid = (left + right) >>> 1; if (nums[mid] < target) left = mid; // 范围缩小到 (mid, right) else right = mid; // 范围缩小到 (left, mid) } return right; } }
python3 解法, 执行用时: 312 ms, 内存消耗: 26.3 MB, 提交时间: 2023-02-13 10:33:51
class Solution: def countFairPairs(self, nums: List[int], lower: int, upper: int) -> int: ans = 0 nums.sort() for j, x in enumerate(nums): r = bisect_right(nums, upper - x, 0, j) l = bisect_left(nums, lower - x, 0, j) ans += r - l return ans