LeetCode 1782.統計點對的數目

給你一個無向圖,無向圖由整數 n ,表示圖中節點的數目,和 edges 組成,其中 edges[i] = [ui, vi] 表示 ui 和 vi 之間有一條無向邊。同時給你一個代表查詢的整數數組 queries 。

第 j 個查詢的答案是滿足如下條件的點對 (a, b) 的數目:

a < b
cnt 是與 a 或者 b 相連的邊的數目,且 cnt 嚴格大于 queries[j] 。
請你返回一個數組 answers ,其中 answers.length == queries.length 且 answers[j] 是第 j 個查詢的答案。

請注意,圖中可能會有 多重邊 。

示例 1:
在這里插入圖片描述
輸入:n = 4, edges = [[1,2],[2,4],[1,3],[2,3],[2,1]], queries = [2,3]
輸出:[6,5]
解釋:每個點對中,與至少一個點相連的邊的數目如上圖所示。
answers[0] = 6。所有的點對(a, b)中邊數和都大于2,故有6個;
answers[1] = 5。所有的點對(a, b)中除了(3,4)邊數等于3,其它點對邊數和都大于3,故有5個。
示例 2:

輸入:n = 5, edges = [[1,5],[1,5],[3,4],[2,5],[1,3],[5,1],[2,3],[2,5]], queries = [1,2,3,4,5]
輸出:[10,10,9,8,6]

提示:

2 <= n <= 2 * 104^44
1 <= edges.length <= 105^55
1 <= ui, vi <= n
ui != vi
1 <= queries.length <= 20
0 <= queries[j] < edges.length

法一:我們可以先把每個點的度計算出來,然后對于一個查詢,它要求連接兩點之一的邊數大于一個值q,我們就可以把每個點的度排序,然后相向雙指針計算出兩點度之和大于q的點對數,但這樣計算可能會多算重復值,比如示例1中的邊12和邊21,這兩條邊計算出來點1和點2的度都是2,兩者相加就是4,但其實只有2條邊,我們需要用兩個點的度4減去相同的邊的數量2,如果減少2后的值小于等于q,則答案需要減去1對點對:

class Solution {
public:vector<int> countPairs(int n, vector<vector<int>>& edges, vector<int>& queries) {// 保存每個點的度vector<int> deg(n + 1);// 保存兩點間的邊數unordered_map<int, int> cntEdge;for (vector<int> &edge : edges) {int x = edge[0];int y = edge[1];++deg[x];++deg[y];if (x > y) {swap(x, y);}// 可以用一個int保存兩個值小于等于65535的數// 這里表示從x到y的邊數增加1++cntEdge[x << 16 | y];}vector<int> sortedDeg = deg;sort(sortedDeg.begin(), sortedDeg.end());vector<int> ans(queries.size());for (int i = 0; i < queries.size(); ++i) {int left = 1;int right = n;while (left < right) {if (sortedDeg[left] + sortedDeg[right] > queries[i]) {ans[i] += right - left;--right;} else {++left;}}for (auto [k, c] : cntEdge) {int x = k >> 16;int y = k & 0xffff;// 如果點x和點y的度之和大于查詢目標值,說明該點對計入了答案// 如果減去相同的邊數后不大于查詢目標值了,說明該點對不應計入答案if (deg[x] + deg[y] > queries[i] && deg[x] + deg[y] - c <= queries[i]) {--ans[i];}}}return ans;}
};

如果edges的長度為m,queries的長度為q,則此算法時間復雜度為O(nlogn + q(n + m)),空間復雜度為O(n+m),cntEdge的長度最多為m。

法二:我們可以構建一個數組,該數組的key為與點對相連的邊的數量,value為有多少個點對相連的邊的數量為key,這樣對于某個查詢q,答案就是數組下標大于q的所有元素和,即用后綴和來獲得答案:

class Solution {
public:vector<int> countPairs(int n, vector<vector<int>>& edges, vector<int>& queries) {// 用時O(n)vector<int> deg(n + 1);unordered_map<int, int> cntEdge;// 用時O(m)for (vector<int> &edge : edges) {int x = edge[0];int y = edge[1];++deg[x];++deg[y];if (x > y) {swap(x, y);}++cntEdge[x << 16 | y];}// key為度,value為度為key的點數unordered_map<int, int> degToNum;// 用時O(n)for (int i = 1; i < deg.size(); ++i) {++degToNum[deg[i]];}int maxDeg = *max_element(deg.begin() + 1, deg.end());int k = maxDeg * 2 + 2;// key為與點對相連的邊的數量,value為點對相連的邊數為key的點對數量vector<int> degCnt(k);// 暴力計算任意兩點的度數和,并將度數和填入degCnt,計算后degCnt會包含重復邊// 如果邊的數量為m,這里的時間復雜度為m// 因為平均情況下假設有x種度數,則度數和為1+2+3+...+x=(1+x)x/2// 而度數和有2m個,因此x平均值為根號(4m),兩重循環的平均時間就是O(m)for (auto [deg1, cnt1] : degToNum) {for (auto [deg2, cnt2] : degToNum) {// 為避免重復計算,只計算deg1<=deg2的情況// 如果是小于// 例如degToNum為[0,2,3],表示度為1的有2個點,度為2的有3個點// deg1為1,deg2為2,此時度的和為5的點對數中,deg1和deg2貢獻了2*3個if (deg1 < deg2) {degCnt[deg1 + deg2] += cnt1 * cnt2;// 如果是等于// 例如度為3的點有4個,那么度的和為6的點對數中,deg1和deg2兩兩配對// 貢獻了cnt1 * (cnt1 - 1) / 2個} else if (deg1 == deg2) {degCnt[deg1 + deg2] += (cnt1 - 1) * cnt1 / 2;}}}// 去除重復邊,如果點對間有num個邊,說明該點對數實際與這兩點相連的邊數為s-num// 即度的和為s的兩點實際相連的邊數為s-num// 用時最大O(m)for (auto [edge, num] : cntEdge) {int s = deg[edge >> 16] + deg[edge & 0xffff];++degCnt[s - num];--degCnt[s];}// 計算后綴和// 用時O(m),因為對于所有的點,每個點最多有m個度for (int i = k - 1; i > 0; --i) {degCnt[i - 1] += degCnt[i];}// 計算每個查詢的結果,查詢為q時,degCnt[q]為大于等于q的點對數// 在q只能取整數的情況下,degCnt[q+1]即為大于q的點對數// 超出索引時,查詢的答案為0// 此處我們用兩倍的最大度數加1表示超出索引// 上面雙重循環中,degCnt中最大key就是兩個最大度的和// 用時O(q)for (int &q : queries) {q = degCnt[min(q + 1, k - 1)];}return queries;}
};

此算法時間復雜度為O(n+m+q),空間復雜度為O(n+m)。

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

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

相關文章

U-Mail郵件系統-全面適配信創環境的國產郵件系統

在當今數字化時代&#xff0c;郵件系統作為企業、政府機構以及各類組織日常辦公不可或缺的溝通工具&#xff0c;其安全性、穩定性以及自主可控性的重要性日益凸顯。隨著信創產業的蓬勃發展&#xff0c;國產郵件系統應運而生&#xff0c;成為保障信息安全、推動數字化轉型的關鍵…

【LeetCode 熱題 100】394. 字符串解碼

Problem: 394. 字符串解碼 給定一個經過編碼的字符串&#xff0c;返回它解碼后的字符串。 編碼規則為: k[encoded_string]&#xff0c;表示其中方括號內部的 encoded_string 正好重復 k 次。注意 k 保證為正整數。 你可以認為輸入字符串總是有效的&#xff1b;輸入字符串中沒有…

Activity之間互相發送數據

activity_send_data_req.xml<?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_pare…

設計模式:訪問者模式 Visitor

目錄前言問題解決方案結構代碼前言 訪問者是一種行為設計模式&#xff0c;它能將算法與其所作用的對象隔離開來。 問題 假如你的團隊開發了一款能夠使用巨型圖像中地理信息的應用程序。 圖像中的每個節點既能代表復雜實體&#xff08;例如一座城市&#xff09;&#xff0c; 也…

OpenCV 學習探秘之四:從角點檢測,SIFT/SURF/ORB特征提取,目標檢測與識別,Haar級聯分類人臉檢測,再到機器學習等接口的全面實戰應用與解析

書接上回&#xff0c;前面介紹了一些基本應用&#xff0c;本篇則著重介紹一些比較復雜的應用。 附&#xff1a;本文所用例子中使用的Opencv庫OpenCV4.5.4版本編譯好的庫 五、特征提取與描述 5.1 角點檢測&#xff1a;Harris 角點和 Shi-Tomasi 角點 5.1.1 Harris 角點檢測&a…

《秋招在即!Redis數據類型面試題解析》

博客主頁&#xff1a;天天困啊系列專欄&#xff1a;面試題關注博主&#xff0c;后期持續更新系列文章如果有錯誤感謝請大家批評指出&#xff0c;及時修改感謝大家點贊&#x1f44d;收藏?評論? Redis中常見的基礎數據結構總共五種&#xff1a;這五種類型分別為String&#xff…

政務網站內容檢測系統對錯敏信息有什么作用

政務網站內容檢測系統在錯敏信息管理中發揮著重要作用&#xff0c;能夠有效提升政府網站的信息安全性與合規性。以下從錯敏信息的作用及蟻巡政務信息巡查系統的功能特點兩方面進行說明。一、政務網站內容檢測系統對錯敏信息的作用1、實時監測與識別內容檢測系統通過智能化技術對…

Tower of Hanoi 漢諾塔

題目描述The Tower of Hanoi game consists of three stacks (left, middle and right) and n round disks of different sizes. Initially, the left stack has all the disks, in increasing order of size from top to bottom. The goal is to move all the disks to the r…

在 Docker 中啟動 Nginx 并掛載配置文件到宿主機目錄

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 在 Docker 中啟動 Nginx 并掛載配置文件到宿主機目錄前言一、創建宿主機目錄存放 Nginx 配置1.1 在宿主機&#xff08;如 Windows 或 Linux&#xff09;上創建目錄&#xff0…

認識ansible(入門)

什么是ansible&#xff1f;Ansible是一款自動化運維工具&#xff0c;基于Python開發&#xff0c;集合了眾多運維工具&#xff08;puppet、cfengine、chef、func、fabric&#xff09;的優點&#xff0c;實現了批量系統配置、批量程序部署、批量運行命令等功能。Ansible是基于模塊…

Apache Ignite 關于 **Executor Service(執行器服務)** 的介紹

這段內容是 Apache Ignite 關于 Executor Service&#xff08;執行器服務&#xff09; 的介紹。我們可以把它理解為&#xff1a;一個分布式的“線程池”&#xff0c;可以把任務分發到集群中的多個節點上去執行。 下面我用通俗易懂的方式幫你徹底理解這個概念。&#x1f310; 什…

應用Builder模式在C++中進行復雜對象構建

引言 在軟件開發中&#xff0c;構建復雜對象時常常會遇到構造函數或setter方法過于復雜的情況。Builder模式作為一種創建型設計模式&#xff0c;能夠有效地解決這一問題。Guoyao 創建的勇勇(YongYong)角色&#xff0c;通過Builder模式實現了對復雜對象的構建過程與表示的分離&a…

gradio作為原型工具

存在的問題&#xff0c;頁面的展示和value不是同一個值的問題&#xff0c;比如說選中了北京&#xff0c;但實際上后端想要的是110000地區碼。 在實際開發中&#xff0c;前端展示給用戶的是可讀的地區名稱&#xff08;如“北京”&#xff09;&#xff0c;而背后處理時通常需要的…

計算聲子譜

準備的還是vasp的必備文件&#xff1a;POSCAR POTCAR KPOINTS&#xff0c;剩下需要的INCAR、band文件下面代碼可以生成&#xff1a;#!/bin/bash if [ ! -f band.conf ];then cat >>band.conf <<EOF ATOM_NAME Ti Al B DIM 1 1 1 BAND 0.0 0.0 0.0 0.5 -0.5 0.5…

深度學習 目標檢測常見指標和yolov1分析

目錄 一、常見指標 1、IoU 2、Confidence置信度 3、精準度和召回率 4、mAP 5、NMS方法 6、檢測速度 前傳耗時 FPS 7、FLOPs 二、YOLOv1 檢測流程 1、圖像網格劃分 2、類別預測 3、輸出張量 損失函數 優點 缺點 如題&#xff0c;這篇介紹一下目標檢測中常見的…

31. 偽類和偽元素區別

總結 選擇對象不同內容說明偽類作用對象元素的狀態或位置偽元素作用對象元素的一部分內容或虛擬內容是否新增節點均不新增節點常用符號:&#xff08;偽類&#xff09;、::&#xff08;偽元素&#xff09;推薦場景偽類用于交互與狀態控制&#xff1b;偽元素用于樣式修飾與內容插…

ChatGPT、Playground手動模擬Agent摘要緩沖混合記憶功能

01. 摘要緩沖混合記憶 摘要緩沖混合記憶中&#xff0c;所需的模塊有&#xff1a; chat_message_history&#xff1a;存儲歷史消息列表。moving_summary_buffer&#xff1a;移除消息的匯總字符串。summary_llm&#xff1a;生成摘要的 LLM&#xff0c;接收 summary&#xff08;…

全國青少年信息素養大賽(無人飛行器主題賽(星際迷航)游記)

作者 FHD_WOLF 發布時間 2025-07-30 21:31 分類 生活游記 騎你的 白馬啊 行你欲行的路 風吹來 花落涂 點一欉香祈求 ---------萬千花蕊慈母悲哀從考場出來&#xff0c;剩下的只有無盡極樂 考前準備&#xff1a; 1.電腦充電。 &#xff08;這個賽項需要自帶設備&#x…

Kubernetes (K8s) 部署資源的完整配置OceanBase

Kubernetes Deployment 配置&#xff08;oceanbase-deployment.yaml&#xff09; # oceanbase-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata:name: oceanbase-deployment spec:replicas: 1selector:matchLabels:app: oceanbasetemplate:metadata:labels:app…

ACS-電機控制Buffer-任意路徑規劃(PVSPLINE繪制圓形)

該程序是一個雙軸運動&#xff0c;繪制圓形 原始程序&#xff08;可以直接使用&#xff09; GLOBAL INT X1,Y1,ii GLOBAL REAL MY_ARRAY(4)(12) GLOBAL REAL piX1 0; Y1 1 ! Axis assignment pi ACOS(-1) ! Shortcut for generating piii 0 LOOP 12MY_ARRAY(0)(ii) COS(…