LeetCode 2563.統計公平數對的數目:排序 + 二分查找

【LetMeFly】2563.統計公平數對的數目:排序 + 二分查找

力扣題目鏈接:https://leetcode.cn/problems/count-the-number-of-fair-pairs/

給你一個下標從 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

解題方法:排序 + 二分查找

要找的是值在一定范圍內的 n u m s [ i ] + n u m s [ j ] nums[i] + nums[j] nums[i]+nums[j],且加法滿足交換律( a + b = b + a a+b=b+a a+b=b+a),所以查找結果和元素順序無關。

所以只需要遍歷 n u m s nums nums的下標作為 i i i,并在 i + 1 i+1 i+1到數組末尾的范圍內查找 j j j的范圍,最終累加到答案中即可。

如何確定 j j j的范圍? u p p e r _ b o u n d ( u p p e r ? i ) ? l o w e r _ b o u n d ( l o w e r ? i ) upper\_bound(upper - i) - lower\_bound(lower - i) upper_bound(upper?i)?lower_bound(lower?i) l o w e r _ b o u n d ( u p p e r ? i + 1 ) ? l o w e r b o u n d ( l o w e r ? i ) lower\_bound(upper - i + 1) - lower_bound(lower - i) lower_bound(upper?i+1)?lowerb?ound(lower?i)均可。

其中 l o w e r b o u n d ( t ) lower_bound(t) lowerb?ound(t)是非遞減數組中第一個插入 t t t后數組仍非遞減的下標, u p p e r b o u n d ( t ) upper_bound(t) upperb?ound(t)是非遞減數組中最后一個插入 t t t后數組仍非遞減的下標。

  • 時間復雜度 O ( n log ? n ) O(n\log n) O(nlogn),其中 n = l e n ( n u m s ) n=len(nums) n=len(nums)
  • 空間復雜度 O ( log ? n ) O(\log n) O(logn)

AC代碼

C++
/** @Author: LetMeFly* @Date: 2025-04-19 15:51:42* @LastEditors: LetMeFly.xyz* @LastEditTime: 2025-04-19 16:12:44*/
/*
l: first j 滿足 nums[j] + nums[i] >= lower | nums[j] >= lower - nums[i]
r: last  j 滿足 nums[j] + nums[i] <= upper | nums[j] <= upper - nums[i]l: lower_bound(lower - nums[i])
r: upper_bound(upper - nums[i])
*/
typedef long long ll;
class Solution {
public:long long countFairPairs(vector<int>& nums, int lower, int upper) {sort(nums.begin(), nums.end());ll ans = 0;for (int i = 0; i < nums.size(); i++) {ans += upper_bound(nums.begin() + i + 1, nums.end(), upper - nums[i]) - lower_bound(nums.begin() + i + 1, nums.end(), lower - nums[i]);// cout << i << ": " << i << "[" << lower_bound(nums.begin() + i + 1, nums.end(), lower - nums[i]) - nums.begin() << ", " << upper_bound(nums.begin() + i + 1, nums.end(), upper - nums[i]) - nums.begin() << ')' << endl;}return ans;}
};
Python
'''
Author: LetMeFly
Date: 2025-04-19 16:13:37
LastEditors: LetMeFly.xyz
LastEditTime: 2025-04-19 16:23:38
'''
from typing import List
from bisect import bisect_left, bisect_rightclass Solution:def countFairPairs(self, nums: List[int], lower: int, upper: int) -> int:nums.sort()return sum(bisect_right(nums, upper - nums[i], i + 1) - bisect_left(nums, lower - nums[i], i + 1) for i in range(len(nums)))
Java
/** @Author: LetMeFly* @Date: 2025-04-19 16:24:08* @LastEditors: LetMeFly.xyz* @LastEditTime: 2025-04-19 16:37:36*/
import java.util.Arrays;class Solution {private int search(int[] nums, int x, int l) {  // search [l, len(nums)) 范圍內第一個大于等于x的下標int r = nums.length;while (l < r) {int mid = (l + r) >> 1;if (nums[mid] >= x) {r = mid;} else {l = mid + 1;}}return l;}public long countFairPairs(int[] nums, int lower, int upper) {Arrays.sort(nums);long ans = 0;for (int i = 0; i < nums.length; i++) {ans += search(nums, upper - nums[i] + 1, i + 1) - search(nums, lower - nums[i], i + 1);}return ans;}
}
Go
/** @Author: LetMeFly* @Date: 2025-04-19 16:24:24* @LastEditors: LetMeFly.xyz* @LastEditTime: 2025-04-19 16:43:06*/
package main
import ("sort"
)func countFairPairs(nums []int, lower int, upper int) (ans int64) {sort.Ints(nums)for i, v := range nums {l := sort.Search(len(nums), func(x int) bool {return x > i && nums[x] >= lower - v})r := sort.Search(len(nums), func(x int) bool {return x > i && nums[x] >= upper - v + 1})ans += int64(r - l)}return
}

同步發文于CSDN和我的個人博客,原創不易,轉載經作者同意后請附上原文鏈接哦~

千篇源碼題解已開源

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/76430.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/76430.shtml
英文地址,請注明出處:http://en.pswp.cn/web/76430.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CF1016賽后總結

文章目錄 前言T1:Ideal GeneratorT2&#xff1a;Expensive NumberT3:Simple RepetitionT4&#xff1a;Skibidi TableT5:Min Max MEXT6:Hackers and Neural NetworksT7:Shorten the Array 前言 由于最近在半期考試&#xff0c;更新稍微晚了一點&#xff0c;還望大家見諒 &#…

HFSS3(limy)——建模學習記錄

前言——筆者使用的是21版HFSS 1.基本模型 為什么沒有環形的天線 2.創建基本模型方法 常用&#xff1a;先粗略建好模型再編輯輸入準確坐標和大小尺寸&#xff08;這里長方體起始點是左上角下方的點&#xff0c;也就是說要輸入模型起點相對于坐標原點的位置尺寸就可以確定具體…

API網關的作用?企業如何應用API網關?

一、API網關的用處 API網關我的分析中會用到以下三種場景。 1、Open API 企業需要將自身數據、能力等作為開發平臺向外開放&#xff0c;通常會以rest的方式向外提供。最好的例子就是淘寶開放平臺、騰訊公司的QQ開發平臺、微信開放平臺。 Open API開放平臺必然涉及到客戶應用…

國網B接口協議圖像數據上報通知接口流程詳解以及上報失敗原因(電網B接口)

文章目錄 一、B接口協議圖像數據上報通知接口介紹B.13.1 接口描述B.13.2 接口流程B.13.3 接口參數B.13.3.1 SIP頭字段B.13.3.2 SIP響應碼B.13.3.3 XML Schema參數定義 B.13.4 消息示例B.13.4.1 圖像數據上報請求B.13.4.2 圖像數據上報響應 二、B接口圖像數據上報通知失敗常見問…

springAi---智能客服

首先被取代的是客服類&#xff0c;智能客服機器人都能夠高效地完成任務。 spring Ai 大模型應用相關開發demo&#xff0c;智能客服系統&#xff1b; 在需求分析階段&#xff0c;把功能屬于傳統Java處理的和ai的功能進行分離 梳理為流程圖如下&#xff1a; 在大模型中&#…

Java面試(2025)——基礎

Java語言有哪些特點&#xff1f; Java語言具有多個顯著特點&#xff0c;使其在編程領域廣受歡迎。首先&#xff0c;Java的跨平臺性非常強&#xff0c;通過Java虛擬機&#xff08;JVM&#xff09;實現“編寫一次&#xff0c;隨處運行”&#xff0c;使得開發者能夠在不同操作系統…

Linux壓縮與解壓命令完全指南:tar.gz、zip等格式詳解

Linux壓縮與解壓命令完全指南&#xff1a;tar.gz、zip等格式詳解 在Linux系統中&#xff0c;文件壓縮和解壓是日常操作中不可或缺的一部分。本文將全面介紹Linux下常用的壓縮和解壓命令&#xff0c;包括tar.gz、tar、zip等格式的區別和使用方法&#xff0c;幫助你高效管理文件…

C++ STL 環形隊列模擬實現

C STL 環形隊列模擬實現 下面是一個使用C STL實現的環形隊列&#xff08;Circular Queue&#xff09;的完整示例&#xff1a; #include <iostream> #include <vector> #include <stdexcept>template <typename T> class CircularQueue { private:std…

部署rocketmq集群

容器化部署RocketMQ5.3.1集群 背景: 生產環境單機的MQ不具有高可用,所以我們應該部署成集群模式,這里給大家部署一個雙主雙從異步復制的Broker集群 一、安裝docker yum install -y docker systemctl enable docker --now # 單機部署參考: https://www.cnblogs.com/hsyw/p/1…

mysql的函數(第一期)

一、字符串函數?? 處理文本數據&#xff0c;常用函數&#xff1a; ??CONCAT(str1, str2, ...)?? ??作用??&#xff1a;拼接字符串。??示例??&#xff1a;SELECT CONCAT(Hello, , World); → Hello World??注意??&#xff1a;若任一參數為 NULL&#xff0c;…

Linux下的網絡管理

注意&#xff1a;本文使用的Linux系統版本為Red Hat Enterprise Linux 9 (RHEL 9)。 在RHEL9上&#xff0c;使用NM&#xff08;NetworkManager&#xff09;進行網絡配置&#xff0c;ifcfg &#xff08;也稱為 文件&#xff09;將不再是網絡配置文件的主存儲。雖然 ifcfg 樣式仍…

游戲引擎學習第233天

原地歸并排序地方很蒙圈 game_render_group.cpp&#xff1a;注意當前的SortEntries函數是O(n^2)&#xff0c;并引入一個提前退出的條件 其實我們不太討論這些話題&#xff0c;因為我并沒有深入研究過計算機科學&#xff0c;所以我也沒有太多內容可以分享。但希望在過去幾天里…

從《周游記3》演繹歌劇版《菊花臺》,周杰倫婚禮曲目意大利文版驚喜亮相

今天&#xff08;4月19日&#xff09;22:00&#xff0c;由魔胴西西里咖啡冠名的戶外實境互動綜藝《周游記3》第四期即將播出。本期節目中&#xff0c;“J式之旅”發起人周杰倫和林暐恒、杜國璋、陳冠霖、陳冠廷&#xff0c;將繼續意大利之旅&#xff0c;從那不勒斯的百年老店到…

Linux系統編程 day6 進程間通信mmap

父子共享的信息&#xff1a;文件描述符&#xff0c;mmap建立的共享映射區&#xff08;MAP_SHARED&#xff09; mmap父子間進程通信 var的時候 &#xff1a;讀時共享&#xff0c;寫時復制 父進程先創建映射區&#xff0c;指定共享MAP_SHARED權限 &#xff0c; fork創建子進程…

opencv--圖像處理

圖像處理技術 圖像處理技術是利用計算機對圖像進行計算,分析和處理的技術,包括數字圖像處理和計算機視覺兩大領域。 對圖像的處理包括濾波,縮放,分割,識別(兩種信息對比)等。 鏈接 數字圖像處理 1. 數字圖像處理(Digital Image Processing) 數字圖像處理主要關注圖…

Spring 學習筆記之 @Transactional詳解

一、數據庫事務基礎 數據庫事務&#xff08;Transaction&#xff09;是數據庫管理系統中用于確保數據一致性和完整性的一種機制。它是一組操作的集合&#xff0c;這些操作要么全部成功&#xff0c;要么全部失敗&#xff0c;從而保證數據庫狀態的正確性。 1.1 事務的基本概念 定…

【Openlayers】Openlayers 入門教程

Openlayers 入門教程 -系列文章列表 openlayers 入門教程&#xff08;一&#xff09;&#xff1a;openlayers簡介 openlayers 入門教程&#xff08;二&#xff09;&#xff1a;Map 篇 openlayers 入門教程&#xff08;三&#xff09;&#xff1a;View 篇 openlayers 入門教程&a…

【Lua語言】Lua語言快速入門

初始Lua Lua是一種輕量小巧的腳本語言&#xff0c;他使用標準C語言編寫并以源代碼形式開放。這意味著Lua虛擬機可以很方便的嵌入別的程序中&#xff0c;從而為應用程序提供靈活的擴展和定制功能。同時&#xff0c;在目前腳本引擎中&#xff0c;Lua的運行速度占有絕對優勢。 變…

車載診斷新架構--- SOVD初入門(上)

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 周末洗了一個澡,換了一身衣服,出了門卻不知道去哪兒,不知道去找誰,漫無目的走著,大概這就是成年人最深的孤獨吧! 舊人不知我近況,新人不知我過…

linux查看目錄相關命令

查看目錄命令 學習目標 能夠使用Linux命令查看目錄信息 1. 查看目錄命令的使用 命令說明ls查看當前目錄信息tree以樹狀方式顯示目錄信息 ls命令效果圖: tree命令效果圖: 2. 查看當前目錄路徑 命令說明pwd查看當前目錄路徑 pwd命令效果圖: 3. 清除終端內容 命令說明clear…