Leetcode373.查找和最小的 K 對數字

文章目錄

  • 題目描述
  • 解題思路
  • 代碼

題目鏈接

題目描述

給定兩個以 非遞減順序排列 的整數數組 nums1 和 nums2 , 以及一個整數 k 。

定義一對值 (u,v),其中第一個元素來自 nums1,第二個元素來自 nums2 。

請找到和最小的 k 個數對 (u1,v1), (u2,v2) … (uk,vk) 。

示例 1:

輸入: nums1 = [1,7,11], nums2 = [2,4,6], k = 3
輸出: [1,2],[1,4],[1,6]
解釋: 返回序列中的前 3 對數:
[1,2],[1,4],[1,6],[7,2],[7,4],[11,2],[7,6],[11,4],[11,6]
示例 2:

輸入: nums1 = [1,1,2], nums2 = [1,2,3], k = 2
輸出: [1,1],[1,1]
解釋: 返回序列中的前 2 對數:
[1,1],[1,1],[1,2],[2,1],[1,2],[2,2],[1,3],[1,3],[2,3]

提示:

1 <= nums1.length, nums2.length <= 105
-109 <= nums1[i], nums2[i] <= 109
nums1 和 nums2 均為 升序排列
1 <= k <= 104
k <= nums1.length * nums2.length

解題思路

參考

多路歸并的方法來解決這個問題,因為我們是找前k個最小的數,那么我們可以這樣來,
令 nums1 的長度為 n,nums2 的長度為 m,所有的點對數量為 n×m。

其中每個 nums1[i] 參與所組成的點序列為:

[(nums1[0],nums2[0]),(nums1[0],nums2[1]),…,(nums1[0],nums2[m?1])]
[(nums1[1],nums2[0]),(nums1[1],nums2[1]),…,(nums1[1],nums2[m?1])]
[(nums1[n?1],nums2[0]),(nums1[n?1],nums2[1]),…,(nums1[n?1],nums2[m?1])]
由于 nums1 和 nums2 均已按升序排序,因此每個 nums1[i] 參與構成的點序列也為升序排序,這引導我們使用「多路歸并」來進行求解。

怎么做呢?
既然是多路排序,那就是把以前的二路排序擴展一下,現在我們使用n路排序,我們按照上面的分法,就可以把序列分成n行,然后,我們可以在這n行中每次選最小的一個就好啦,這樣選k次,就是我們要的答案了。
具體怎么實現呢?
我們其實的時候買把這n個序列的第一個元素(以二元組(i,j))入隊(優先隊列,或者是小根堆),其中 i 為該點對中 nums1[i] 的下標,j 為該點對中 nums2[j]的下標,這里可以有一個小優化,我們始終確保nums1為兩數組中長度較小的那個,然后通過標記來記錄是否發生過交換,確保答案的點順序的正確性。
每次從優先隊列中取出堆頂元素(這個堆頂就是當前未被加入到答案的所有點對中的最小值)加入答案,并將該點對所在序列的下一位(如果有的話)加入到優先隊列。

代碼

class Solution {boolean flag = true;public List<List<Integer>> kSmallestPairs(int[] nums1, int[] nums2, int k) {int n = nums1.length, m = nums2.length;if(n > m && !(flag = false))return kSmallestPairs(nums2, nums1, k);List<List<Integer>> ans = new ArrayList<>();PriorityQueue<int[]> q = new PriorityQueue<>((a,b) -> (nums1[a[0]] + nums2[a[1]]) - (nums1[b[0]] + nums2[b[1]]));// 如果n>k的話,那我們其實只需要建立nums1的前k個序對就夠了for(int i=0; i<Math.min(n, k) ;i++){q.add(new int[]{i,0});}while(ans.size() < k && !q.isEmpty()){int[] poll = q.poll();int a = poll[0], b= poll[1];ans.add(new ArrayList<>(){{add(flag ? nums1[a] : nums2[b]);add(flag ? nums2[b] : nums1[a]);}});if(b+1 < m)q.add(new int[]{a, b+1});}return ans;}
}

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

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

相關文章

大模型日報2024-05-29

大模型日報 2024-05-29 大模型資訊 大型語言模型在金融預測中將超越人類分析師 摘要: 新研究表明&#xff0c;大型語言模型如ChatGPT在金融預測方面表現優于人類專家&#xff0c;為交易策略提供了寶貴的見解。這意味著未來這些模型將在金融領域發揮更重要的作用&#xff0c;提升…

使用Keepalived提高吞吐量和負載均衡ip_hash.

一 . Nginx使用Keepalived提高吞吐量案例 Keepalived[表示把連接保持一定長連接數來提高吞吐量] 1.1沒有使用keepalived參數 upstream tomcats {server 192.168.28.102:8080; } server {listen 88;server_name www.tomcats.com;location / {proxy_pass http://to…

深入探索JavaScript:精準判斷對象間的“真”相等【含代碼示例】

深入探索JavaScript&#xff1a;精準判斷對象間的“真”相等【含代碼示例】 基本概念與作用說明 與 的區別Object.is()深度比較的必要性 實戰案例&#xff1a;五種深度比較策略案例一&#xff1a;樸素遞歸法案例二&#xff1a;JSON.stringify()法&#xff08;謹慎使用&#xf…

postman教程-6-發送delete請求

領取資料&#xff0c;咨詢答疑&#xff0c;請?wei: June__Go 上一小節我們學習了postman發送put請求的方法&#xff0c;本小節我們講解一下postman發送delete請求的方法。 HTTP DELETE 請求是一種用于刪除指定資源的請求方法。在RESTful API 設計中&#xff0c;DELETE 請求…

tensorboard可視化時save_graph報錯ERROR: Graphs differed across invocations!的一個解決方法

在使用tensorboard可視化&#xff0c;經常會將模型通過save_graph方法保存下來&#xff0c;方便查看結構。在使用save_graph經常會遇到錯誤&#xff08;至少我經常遇到&#xff09;&#xff0c;對于我&#xff0c;最常見的一個錯誤為 Tracing failed sanity checks! ERROR: Gr…

GPT-4o:重塑人機交互的未來

一個愿意佇立在巨人肩膀上的農民...... 一、推出 在人工智能&#xff08;AI&#xff09;領域&#xff0c;自然語言處理&#xff08;NLP&#xff09;技術一直被視為連接人類與機器的橋梁。近年來&#xff0c;隨著深度學習技術的快速發展&#xff0c;NLP領域迎來了前所未有的變革…

ARM-V9 RME(Realm Management Extension)系統架構之系統能力的執行隔離

安全之安全(security)博客目錄導讀 目錄 一、執行隔離 1、安全狀態 2、安全模型 本博客探討 RME 所需的系統能力&#xff0c;以保證 Arm CCA 對于 Realms 的安全性和隔離特性。 一、執行隔離 1、安全狀態 RME 系統支持以下安全狀態&#xff1a; 非安全 (Non-secure)安全…

Orange Pi Kunpeng Pro測評

#創作靈感# 參加樹莓派鯤鵬開發版的測評活動&#xff0c;也想體驗一下該開發版&#xff0c;之前有做過樹莓派和香橙派的開發&#xff0c;剛好借此機會了解一下鯤鵬&#xff0c;所以就有了這篇測評文章。 #正文# 引言 說是測評&#xff0c;其實也沒有多少測評方面的內容&…

前端面試題23-34

23. 說說你對 Promise 的理解 Promise 是 ECMAScript6 引入的一種異步編程解決方案&#xff0c;用于處理異步操作。它表示一個尚未完成但最終會結束的操作&#xff0c;具有三種狀態&#xff1a;pending&#xff08;進行中&#xff09;、fulfilled&#xff08;已完成&#xff0…

代碼隨想錄算法訓練營Day22|235.二叉搜索樹的最近公共祖先、701.二叉搜索樹中的插入操作、450.刪除二叉搜索樹中的節點

二叉搜索樹的最近公共祖先 不考慮二叉搜索樹這一條件的話&#xff0c;普通的二叉搜索樹搜索最近的公共祖先就是昨日的做法&#xff0c;這種做法也能解決二叉搜索樹的最近公共祖先。 class Solution { public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, Tr…

貪心算法02(leetcode122/55/4)

參考資料&#xff1a; https://programmercarl.com/0122.%E4%B9%B0%E5%8D%96%E8%82%A1%E7%A5%A8%E7%9A%84%E6%9C%80%E4%BD%B3%E6%97%B6%E6%9C%BAII.html 122. 買賣股票的最佳時機 II 題目描述&#xff1a; 給你一個整數數組 prices &#xff0c;其中 prices[i] 表示某支股票第…

STM32讀寫內部FLASH讀取芯片id

文章目錄 讀寫內部Flash接線程序編寫測試效果補充 讀取芯片id代碼編寫 讀寫內部Flash 接線 程序編寫 首先使用ThisFlash.c來寫入flash的基本操作&#xff0c;寫入、讀取、擦除&#xff0c;然后使用Store.c配合數組來進行主存與flash的交互 ThisFlash.c #include "stm32…

為什么工控現場會用到Profinet轉Modbus網關設備

一、背景&#xff1a; 工控現場之所以需要使用Profinet轉Modbus網關&#xff0c;是因為工控系統中常常存在不同廠家設備之間通訊協議不一致的問題。而Modbus和Profinet分別代表著兩種不同的通信協議&#xff0c;Profinet通常用于較新的設備&#xff0c;而Modbus則是比較老的通…

思科防火墻ASA Version 9.1(1) 怎么配置靜態NAT,把內網ip192.168.1.10 端口1000映射到公網端口1000上?

環境: 思科防火墻5520 ASA Version 9.1(1) 問題描述: 思科防火墻ASA Version 9.1(1) 怎么配置靜態NAT,把內網ip192.168.1.10 端口1000映射到公網端口1000上? 解決方案: 舊版本8.0 1.做之前要先查一下有沒有端口被占用,要和業務確認2.sh Xlate | in 10011 端口 這條…

ch2應用層--計算機網絡期末復習

2.1應用層協議原理 網絡應用程序位于應用層 開發網絡應用程序: 寫出能夠在不同的端系統上通過網絡彼此通信的程序 2.1.1網絡應用程序體系結構分類: 客戶機/服務器結構 服務器: 總是打開(always-on)具有固定的、眾所周知的IP地址 主機群集常被用于創建強大的虛擬服務器 客…

MongoDB CRUD操作:快照查詢

MongoDB CRUD操作&#xff1a;快照查詢 文章目錄 MongoDB CRUD操作&#xff1a;快照查詢對比本地和快照的讀關注舉例從相同的時間點運行查詢從過去某個時刻讀取數據的一致狀態 配置快照保留時間磁盤空間和歷史記錄 使用快照查詢可以讀取最近某個時間點的數據&#xff0c;而且從…

基于51單片機的溫控風扇的設計–仿真設計

可實現通過DS18B20測量當前環境溫度 可實現通過溫度自動控制風扇轉速 可實現通過按鍵設置不同風速對應的溫度 可實現通過按鍵切換自動、手動模式 可實現在手動模式下通過按鍵調整風扇轉速 可實現通過LCD1602顯示溫度、風扇轉速擋位、自動/手動模式

【C++】模擬實現string類

&#x1f984;個人主頁:修修修也 &#x1f38f;所屬專欄:C ??操作環境:Visual Studio 2022 目錄 一.了解項目功能 二.逐步實現項目功能模塊及其邏輯詳解 &#x1f38f;構建成員變量 &#x1f38f;實現string類默認成員函數 &#x1f4cc;構造函數 &#x1f4cc;析構函數…

k8s 全面掌控日志系統

概述 為了提高系統運維和故障排查的效率&#xff0c; 日志系統采用 ELK&#xff08;Elasticsearch、Logstash、Kibana&#xff09;技術棧&#xff0c;通過 FileBeats 作為日志收集器&#xff0c;將來自不同節點的日志數據匯總并存儲在 Elasticsearch 中&#xff0c;最終通過 K…

創建一個新的Spring Security應用程序,并使用JDBC連接數據庫

創建一個新的Spring Security應用程序&#xff0c;并使用JDBC連接數據庫 在這個教程中&#xff0c;我們將學習如何創建一個新的Spring Security應用程序&#xff0c;使用JDBC連接數據庫以獲取用戶信息并進行認證。我們還將學習如何配置Spring Security以從數據庫中獲取用戶和權…