LeetCode: 數組中的第K個最大元素

問題描述

在未排序的數組中找到第k個最大的元素。請注意,你需要找的是數組排序后的第k個最大的元素,而不是第k個不同的元素。

解題思路

解決這個問題有多種方法,下面是幾種常見的解題策略:

  1. 排序后選擇: 將數組排序,然后選擇第len(array) - k位置上的元素。
  2. 優先隊列(最小堆): 使用一個大小為k的最小堆,遍歷數組維護堆的大小為k,堆頂即為第k個最大元素。
  3. 快速選擇(QuickSelect): 快速選擇算法是快速排序的變體,用于找到未排序數組中第k個最大的元素。
代碼示例
排序后選擇
class Solution:def findKthLargest(self, nums, k):nums.sort()return nums[-k]

這種方法的時間復雜度為O(NlogN),空間復雜度為O(1)(如果使用的是原地排序算法)。

優先隊列(最小堆)
import heapqclass Solution:def findKthLargest(self, nums, k):heap = []for num in nums:heapq.heappush(heap, num)if len(heap) > k:heapq.heappop(heap)return heap[0]

這種方法的時間復雜度為O(NlogK),空間復雜度為O(K)。

快速選擇(QuickSelect)
class Solution:def findKthLargest(self, nums, k):k = len(nums) - kdef quickselect(l, r):pivot, p = nums[r], lfor i in range(l, r):if nums[i] <= pivot:nums[p], nums[i] = nums[i], nums[p]p += 1nums[p], nums[r] = nums[r], nums[p]if p > k: return quickselect(l, p - 1)if p < k: return quickselect(p + 1, r)return nums[p]return quickselect(0, len(nums) - 1)
int partition(vector<int>& nums,int left,int right)
{int key = nums[left];while(left < right){while(left < right and nums[right] >= key ){right--;}nums[left] = nums[right]while(left < right and nums[left] <= key ){left++;}nums[right] = nums[left]}nums[left] = key; return left;  }int findk(vector<int>& nums)
{random_shuffle(nums.begin(),nums.end());int n = nums.size();int left = 0,rihgt = n-1;while(True){int p = partition(nums,left,right);if(p == n-k){return nums[p];}else if(p > n-k){right = p-1;}else{left = p +1;}}return -1;
}

?

快速選擇的平均時間復雜度為O(N),最壞情況下的時間復雜度為O(N^2),空間復雜度為O(1)。

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

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

相關文章

ProChat 如何接入 WebSocket

WebSocket是一種在單個TCP連接上進行全雙工通信的協議&#xff0c;允許客戶端和服務器之間進行雙向實時通信。與Server-Sent Events (SSE)類似&#xff0c;WebSocket也能實現實時數據推送&#xff0c;但其功能更為強大且靈活。 全雙工通信&#xff1a;WebSocket不僅允許服務器向…

【TestNG】(4) 重試機制與監聽器的使用

在UI自動化測試用例執行過程中&#xff0c;經常會有很多不確定的因素導致用例執行失敗&#xff0c;比如網絡原因、環境問題等&#xff0c;所以我們有必要引入重試機制&#xff08;失敗重跑&#xff09;&#xff0c;來提高測試用例成功率。 在不寫代碼的情況沒有提供可配置方式…

Mysql 慢查詢日志

查詢是否開啟慢SQL日志 show variables like %slow_query_log; 開啟慢查詢日志 set global slow_query_logON; 可以通過修改MySQL的配置my.cfg或者my.ini永久生效 slow_query_logON # 開啟慢查詢日志開關 slow_query_log_file/var/lib/mysql/alvin-slow.log # 慢查詢日志…

1.2 在卷積神經網絡中,如何計算各層感受野的大小

1.2 在卷積神經網絡中&#xff0c;如何計算各層感受野的大小 分析與解答&#xff1a; 在卷積神經網絡中&#xff0c;由于卷積的局部連接性&#xff0c;輸出特征圖上的每個節點的取值&#xff0c;是由卷積核在輸入特征圖對應位置的局部區域內進行卷積而得到的&#xff0c;因此這…

COM - IWbemClassObject對象屬性的遍歷

文章目錄 COM - IWbemClassObject對象屬性的遍歷概述筆記場景封裝好的函數bool CWmiBase::enumObjVaule(IWbemClassObject* obj, std::wstring& val)bool CWmiBase::appendVarToString(BSTR& strName, VARIANT& var, std::wstring& val)bool CWmiBase::get_var…

【筆試強訓錯題選擇題】Day5.習題(錯題)解析

文章目錄 前言 錯題題目 錯題解析 總結 前言 錯題題目 1. ? ? 2. 3. ? 4. ? 5. ? 錯題解析 1. 移位運算符的使用 2. 3. 4. 5. 總結

如何用TCC實現分布式事務?

TCC事務介紹 TCC&#xff08;Try-Confirm-Cancel&#xff09;是除可靠消息隊列以外的另一種常見的分布式事務機制&#xff0c;它是由數據庫專家帕特 赫蘭德&#xff08;Pat Helland&#xff09;在2007年撰寫的論文《Life beyond Distributed Transactions: An Apostate’s Op…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的體育賽事目標檢測系統(Python+PySide6界面+訓練代碼)

摘要&#xff1a;開發和研究體育賽事目標檢測系統對于增強體育分析和觀賞體驗至關重要。本篇博客詳細講述了如何運用深度學習技術構建一個體育賽事目標檢測系統&#xff0c;并提供了完整的實現代碼。系統基于先進的YOLOv8算法&#xff0c;對比了YOLOv7、YOLOv6、YOLOv5的性能&a…

【webrtc】p2p_transport_channel 中忽略Hyper-V

【win11】更改網絡適配器設置 刪掉了hype-v,這時候wsl2 打不開了,但是重啟后,還是存在hyper-v那么,讓webrtc自己不適用hyper-v的網絡Hyper-V 的全程:Hyper-V Virtual Ethernet Adapter https://github.com/SophistSolutions/Stroika/blob/2cd5e8bf4ee01cb5c423367b4df628f…

MFC 模態對話框退出機制的探究

一位讀者問了這樣一個問題: ” 如果我創建了一個可見的模態對話框,卻對用戶來說不可用。舉個例子,假設我在程序中的其他位置收到一個事件,并且我從事件中調用模態 CDialog 上的 DestroyWindow。我注意到 OnDestroy 是在 CDialog 上調用的,但在將 WM_QUIT 消息發送到模態對…

在MyBatis中自定義JsonTypeHandler

在MyBatis中使用自定義的JsonTypeHandler 在處理數據庫中的JSON字段時&#xff0c;我們經常需要將JSON字符串映射到Java對象&#xff0c;或者將Java對象序列化為JSON字符串以存儲在數據庫中。MyBatis作為一個流行的Java持久層框架&#xff0c;允許我們通過自定義類型處理器&am…

爬蟲入門到精通_實戰篇7(Requests+正則表達式爬取貓眼電影)_ 抓取單頁內容,正則表達式分析,保存至文件,開啟循環及多線程

1 目標 貓眼榜單TOP100&#xff1a;https://www.maoyan.com/board 2 流程框架 抓取單頁內容&#xff1a;利用requests請求目標站點&#xff0c;得到單個網頁HTML代碼&#xff0c;返回結果。正則表達式分析&#xff1a;根據HTML代碼分析得到電影名稱,主演,上映時間,評分,圖片…

跨域問題與解決方法

跨域問題與解決方法 同源策略 瀏覽器很容易受到XSS、CSFR等攻擊。所謂同源是指"協議域名端口"三者相同&#xff0c;即便兩個不同的域名指向同一個ip地址&#xff0c;也非同源。 同源策略限制以下幾種行為&#xff1a; Cookie、LocalStorage 和 IndexDB 無法讀取 DO…

C語言中的分支和循環語句:從入門到精通

分支和循環語句 1. 前言2. 預備知識2.1 getchar函數2.2 putchar函數2.3 計算數組的元素個數2.4 清屏2.5 程序的暫停2.6 字符串的比較 3. 結構化3.1 順序結構3.2 分支結構3.3 循環結構 4. 真假性5. 分支語句&#xff08;選擇結構&#xff09;5.1 if語句5.1.1 語法形式5.1.2 else…

Java網絡通信UDP

目錄 網絡通信基礎 UDP通信 服務器 1.想要使用UDP通信 要先打開DatagramSocket文件 端口號可以手動指定或系統隨機分配 2.阻塞等待接收客戶端數據&#xff1b;創建DatagramPacket接收客戶端傳來的數據 3.處理客戶端傳來的數據&#xff0c;并進行業務處理&#xff08;這里…

MySQL 教程 2.4

MySQL UNION 操作符 本教程為大家介紹 MySQL UNION 操作符的語法和實例。 描述 MySQL UNION 操作符用于連接兩個以上的 SELECT 語句的結果組合到一個結果集合&#xff0c;并去除重復的行。 UNION 操作符必須由兩個或多個 SELECT 語句組成&#xff0c;每個 SELECT 語句的列數…

Python降維數據庫之umap使用詳解

概要 在數據科學和機器學習領域,數據通常是高維度的,而高維度數據不僅難以可視化,還會增加建模的復雜性。降維是一種處理高維數據的關鍵技術,而Python UMAP(Uniform Manifold Approximation and Projection)是一種強大的降維工具,它在保留數據結構的同時,將高維數據映…

uni-app引用外部js文件

全局引用 在App.vue文件中添加如下代碼 這樣在全局所有頁面中都可以直接使用該外部js中的函數 onLaunch: function() {var script document.createElement(script);script.src "https://www.test.com/api/testapi.js";document.body.appendChild(script); }, 單…

【IDEA+通義靈碼插件】實現屬于你的大模型編程助手

目錄 1.前言 2.下載安裝 3.解釋代碼 4.生成單元測試 5.生成注釋 6.智能補全 1.前言 大模型到底該以一種什么方式落地&#xff0c;從而嵌入我們的工作當中&#xff0c;助力我們工作效率的提升&#xff0c;其實最好的方式也許就是虛擬助手的方式&#xff0c;就像鋼鐵俠的&…

【OpenCV基礎(三)】Ubuntu系統下EasyPR環境配置

環境配置 1、資源下載2、環境配置2.1、1、將EasyPR壓縮包拷貝到Ubuntu 三種方法任選一種2.2、解壓得到EasyPR文件夾(文件夾一層進入后EasyPR資源內容)2.3、終端命令修改權限**chmod -R 777 ./ EasyPR**2.4、查找EasyPR/include/easypr/config.h&#xff0c;使用gedit方式打開2.…