算法刷題記錄——LeetCode篇(3.2) [第211~212題](持續更新)

更新時間:2025-04-04

  • 算法題解目錄匯總:算法刷題記錄——題解目錄匯總
  • 技術博客總目錄:計算機技術系列博客——目錄頁

優先整理熱門100及面試150,不定期持續更新,歡迎關注!


215. 數組中的第K個最大元素

給定整數數組 nums 和整數 k,請返回數組中第 k 個最大的元素。
請注意,你需要找的是數組排序后的第 k 個最大的元素,而不是第 k 個不同的元素。
你必須設計并實現時間復雜度為 O(n) 的算法解決此問題。

示例 1:

輸入: [3,2,1,5,6,4], k = 2
輸出: 5

示例 2:

輸入: [3,2,3,1,2,4,5,5,6], k = 4
輸出: 4

提示:

  • 1 <= k <= nums.length <= 10^5
  • -10^4 <= nums[i] <= 10^4

方法:三向切分快速選擇法

利用快速選擇算法結合三向切分,高效定位第K大元素。

  1. 三向切分

    • 將數組分為三個區域:大于基準值、等于基準值、小于基準值;
    • 采用類似荷蘭國旗問題的分區方式,一次遍歷完成分類;
  2. 遞歸選擇

    • 根據當前分區后的元素數量分布,決定遞歸處理方向;
    • 大于區域元素足夠時遞歸處理前部;
    • 數量不足但包含等于區域時直接返回基準值;
    • 否則遞歸處理后部并調整k值;

隨機選擇基準值避免最壞情況,每次遞歸至少排除一個區域元素。

代碼實現(Java):

class Solution {public int findKthLargest(int[] nums, int k) {return quickSelect(nums, 0, nums.length - 1, k);}private int quickSelect(int[] nums, int left, int right, int k) {if (left == right) {return nums[left];}Random rand = new Random();int pivotIndex = left + rand.nextInt(right - left + 1);int pivot = nums[pivotIndex];// 三向切分(荷蘭國旗問題)int low = left;int high = right;int mid = left;while (mid <= high) {if (nums[mid] > pivot) {  // 大于pivot的交換到前部swap(nums, low, mid);low++;mid++;} else if (nums[mid] < pivot) { // 小于pivot的交換到后部swap(nums, mid, high);high--;} else {  // 等于時繼續后移mid++;}}// 計算各區域元素數量int gtCount = low - left;       // 大于pivot的數目int eqCount = high - low + 1;   // 等于pivot的數目if (k <= gtCount) {             // 目標在大于區域return quickSelect(nums, left, low - 1, k);} else if (k <= gtCount + eqCount) { // 目標在等于區域return pivot;} else {                        // 目標在小于區域return quickSelect(nums, high + 1, right, k - gtCount - eqCount);}}private void swap(int[] nums, int i, int j) {int temp = nums[i];nums[i] = nums[j];nums[j] = temp;}
}

復雜度分析

平均時間復雜度 O(n),最壞情況 O(n^2)


聲明

  1. 本文版權歸 CSDN 用戶 Allen Wurlitzer 所有,遵循CC-BY-SA協議發布,轉載請注明出處。
  2. 本文題目來源 力扣-LeetCode ,著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。

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

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

相關文章

【linux學習】linux系統調用編程

目錄 一、任務、進程和線程 1.1任務 1.2進程 1.3線程 1.4線程和進程的關系 1.5 在linux系統下進程操作 二、Linux虛擬內存管理與stm32的真實物理內存區別 2.1 Linux虛擬內存管理 2.2 STM32的真實物理內存映射 2.3區別 三、 Linux系統調用函數 fork()、wait()、exec(…

react redux的學習,多個reducer

redux系列文章目錄 第一章 簡單學習redux,單個reducer 前言 前面我們學習到的是單reducer的使用&#xff1b;要知道redux是個很強大的狀態存儲庫&#xff0c;可以支持多個reducer的使用。 combineReducers ?combineReducers?是Redux中的一個輔助函數&#xff0c;主要用于…

Oracle數據庫數據編程SQL<3.5 PL/SQL 存儲過程(Procedure)>

存儲過程(Stored Procedure)是 Oracle 數據庫中一組預編譯的 PL/SQL 語句集合,存儲在數據庫中并可通過名稱調用執行。它們是企業級數據庫應用開發的核心組件。 目錄 一、存儲過程基礎 1. 存儲過程特點 2. 創建基本語法 3. 存儲過程優點 4. 簡單示例 二、沒有參數的存儲…

手撕AVL樹

引入&#xff1a;為何要有AVL樹&#xff0c;二次搜索樹有什么不足&#xff1f; 二叉搜索樹有其自身的缺陷&#xff0c;假如往樹中插入的元素有序或者接近有序&#xff0c;二叉搜索樹就會退化成單支樹&#xff0c;時間復雜度會退化成O(N)&#xff0c;因此產生了AVL樹&#xff0c…

《 C語言中的變長數組:靈活而強大的特性》

&#x1f680;個人主頁&#xff1a;BabyZZの秘密日記 &#x1f4d6;收入專欄&#xff1a;C語言 &#x1f30d;文章目入 一、變長數組的定義二、變長數組的優勢三、變長數組的使用示例示例1&#xff1a;動態輸入數組大小示例2&#xff1a;變長數組在函數中的應用 四、變長數組的…

【微服務】基礎概念

1.什么是微服務 微服務其實就是一種架構風格&#xff0c;他提倡我們在開發的時候&#xff0c;一個應用應該是一組小型服務而組成的&#xff0c;每一個服務都運行在自己的進程中&#xff0c;每一個小服務都通過HTTP的方式進行互通。他更加強調服務的徹底拆分。他并不是僅局限于…

Linux make與makefile 項目自動化構建工具

本文章將對make與makefile進行一些基礎的講解。 假設我們要建造一座房子&#xff0c;建造過程涉及很多步驟&#xff0c;比如打地基、砌墻、安裝門窗、粉刷墻壁等。每個步驟都有先后順序&#xff0c;并且有些步驟可能依賴于其他步驟的完成。比如&#xff0c;你必須先打好地基才…

如何判斷多個點組成的3維面不是平的,如果不是平的,如何拆分成多個平面

判斷和拆分三維非平面為多個平面 要判斷多個三維點組成的面是否為平面&#xff0c;以及如何將非平面拆分為多個平面&#xff0c;可以按照以下步驟進行&#xff1a; 判斷是否為平面 平面方程法&#xff1a; 選擇三個不共線的點計算平面方程&#xff1a;Ax By Cz D 0檢查其…

多layout 布局適配

安卓多布局文件適配方案操作流程 以下為通過多套布局文件適配不同屏幕尺寸/密度的詳細步驟&#xff0c;結合主流適配策略及最佳實踐總結&#xff1a; 一、?創建多套布局資源目錄? ?按屏幕尺寸劃分? 在 res 目錄下創建以下文件夾&#xff08;根據設備特性自動匹配&#xff…

Java 大視界 -- Java 大數據在智能農業無人機植保作業路徑規劃與藥效評估中的應用(165)

&#x1f496;親愛的朋友們&#xff0c;熱烈歡迎來到 青云交的博客&#xff01;能與諸位在此相逢&#xff0c;我倍感榮幸。在這飛速更迭的時代&#xff0c;我們都渴望一方心靈凈土&#xff0c;而 我的博客 正是這樣溫暖的所在。這里為你呈上趣味與實用兼具的知識&#xff0c;也…

美關稅加征下,Odoo免費開源ERP如何助企業破局?

近期&#xff0c;美國特朗普政府推行的關稅政策對全球供應鏈和進出口企業造成巨大沖擊&#xff0c;尤其是依賴中美貿易的企業面臨成本激增、利潤壓縮和合規風險。在此背景下&#xff0c;如何通過數字化轉型優化管理效率、降低運營成本成為企業生存的關鍵。本文以免費開源ERP系統…

go游戲后端開發25:紅中麻將規則介紹

一、游戲基礎規則介紹 在開發紅中麻將游戲之前&#xff0c;我們需要先了解其基礎規則。紅中麻將的牌面由 a、b、c、d 四種花色組成&#xff0c;其中 a、b、c 分別代表萬、條、筒&#xff0c;每種花色都有 1 - 9 的九種牌&#xff0c;每種牌各有四張&#xff0c;總計 36 張 4 …

Unity:平滑輸入(Input.GetAxis)

目錄 1.為什么需要Input.GetAxis&#xff1f; 2. Input.GetAxis的基本功能 3. Input.GetAxis的工作原理 4. 常用參數和設置 5. 代碼示例&#xff1a;用GetAxis控制角色移動 6. 與Input.GetAxisRaw的區別 7.如何優化GetAxis&#xff1f; 1.為什么需要Input.GetAxis&…

OpenCV:計算機視覺的強大開源庫

文章目錄 引言一、什么是OpenCV&#xff1f;1.OpenCV的核心特點 二、OpenCV的主要功能模塊1. 核心功能&#xff08;Core Functionality&#xff09;2. 圖像處理&#xff08;Image Processing&#xff09;3. 特征檢測與描述&#xff08;Features2D&#xff09;4. 目標檢測&#…

AI浪潮下的IT職業轉型:醫藥流通行業傳統IT顧問的深度思考

AI浪潮下的IT職業轉型&#xff1a;醫藥流通行業傳統IT顧問的深度思考 一、AI重構IT行業的技術邏輯與實踐路徑 1.1 醫藥流通領域的智能辦公革命 在醫藥批發企業的日常運營中&#xff0c;傳統IT工具正經歷顛覆性變革。以訂單處理系統為例&#xff0c;某醫藥集團引入AI智能客服…

Qt進階開發:QFileSystemModel的使用

文章目錄 一、QFileSystemModel的基本介紹二、QFileSystemModel的基本使用2.1 在 QTreeView 中使用2.2 在 QListView 中使用2.3 在 QTableView 中使用 三、QFileSystemModel的常用API3.1 設置根目錄3.2 過濾文件3.2.1 僅顯示文件3.2.2 只顯示特定后綴的文件3.2.3 只顯示目錄 四…

KAPC的前世今生--(下)下RPCRT4!NMP_SyncSendRecv函數分析

第一部分&#xff1a;nt!KiDeliverApc函數調用nt!IopCompleteRequest函數后準備返回 1: kd> kv # ChildEBP RetAddr Args to Child 00 ba3eec18 80a3c83b 896e4e40 ba3eec64 ba3eec58 nt!IopCompleteRequest0x3a3 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv…

深入理解C++引用:從基礎到現代編程實踐

一、引用的本質與基本特性 1.1 引用定義 引用是為現有變量創建的別名&#xff0c;通過&符號聲明。其核心特點&#xff1a; 必須初始化且不能重新綁定 與被引用變量共享內存地址 無獨立存儲空間&#xff08;編譯器實現&#xff09; 類型必須嚴格匹配 int value 42; in…

嵌入式Linux開發環境搭建,三種方式:虛擬機、物理機、WSL

目錄 總結寫前面一、Linux虛擬機1 安裝VMware、ubuntu18.042 換源3 改中文4 中文輸入法5 永不息屏6 設置 root 密碼7 安裝 terminator8 安裝 htop&#xff08;升級版top&#xff09;9 安裝 Vim10 靜態IP-虛擬機ubuntu11 安裝 ssh12 安裝 MobaXterm &#xff08;SSH&#xff09;…

軟件工程面試題(二十七)

1、j a v a 對象初始化順序 1.類的初始化(initialization class & interface) 2.對象的創建(creation of new class instances) 順序:應為類的加載肯定是第一步的,所以類的初始化在前。大體的初始化順序是: 類初始化 -> 子類構造函數 -> 父類構造函數 -&g…