[LeetCode] 2563. Count the Number of Fair Pairs
Given a 0-indexed integer array nums of size n and two integers lower and upper, return the number of fair pairs.
A pair (i, j) is fair if:
0 <= i < j < n, and
lower <= nums[i] + nums[j] <= upper
Example 1:
Input: nums = [0,1,7,4,4,5], lower = 3, upper = 6
Output: 6
Explanation: There are 6 fair pairs: (0,3), (0,4), (0,5), (1,3), (1,4), and (1,5).
Example 2:
Input: nums = [1,7,9,2,5], lower = 11, upper = 11
Output: 1
Explanation: There is a single fair pair: (2,3).
Constraints:
1 <= nums.length <= 105
nums.length == n
-109 <= nums[i] <= 109
-109 <= lower <= upper <= 109
统计公平数对的数目。
给你一个下标从 0 开始、长度为 n 的整数数组 nums ,和两个整数 lower 和 upper ,返回 公平数对的数目 。
如果 (i, j) 数对满足以下情况,则认为它是一个 公平数对 :
0 <= i < j < n,且
lower <= nums[i] + nums[j] <= upper
思路
注意我们要找的 i 和 j 满足lower <= nums[i] + nums[j] <= upper
的数对的个数,而且是闭区间。那么我们可以把这个条件改写为找到 i 和 j 满足 nums[i] + nums[j] <= upper
的个数减去 nums[i] + nums[j] <= lower - 1
的个数。
这道题的思路跟 611 题,2824 题很像,可以先做这两题。做完这两题再做本题你就会发现我们还是可以对 input 数组排序,排序之后我们用一个 helper 函数分别去找 nums[i] + nums[j] <= upper
的个数和nums[i] + nums[j] <= lower - 1
的个数。
复杂度
时间O(n^2)
空间O(1)
代码
Java实现
class Solution { public long countFairPairs(int[] nums, int lower, int upper) { Arrays.sort(nums); return helper(nums, upper) - helper(nums, lower - 1); } private long helper(int[] nums, int target) { long res = 0; int left = 0; int right = nums.length - 1; while (left < right) { int sum = nums[left] + nums[right]; if (sum <= target) { res += right - left; left++; } else { right--; } } return res; } }
相关题目
259. 3Sum Smaller 611. Valid Triangle Number 2563. Count the Number of Fair Pairs 2824. Count Pairs Whose Sum is Less than Target
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
2022-11-24 [LeetCode] 795. Number of Subarrays with Bounded Maximum