【力扣hot100題】(073)數組中的第K個最大元素

花了兩天時間搞明白答案的快速排序和堆排序。

兩種都寫了一遍,感覺堆排序更簡單很多。

兩種都記錄一下,包括具體方法和易錯點。

快速排序

class Solution {
public:vector<int> nums;int quicksort(int left,int right,int k){if(left==right) return nums[k];int r=right;int mid=left;left--;right++;while(left<right){do left++; while(nums[left]<nums[mid]);do right--; while(nums[right]>nums[mid]);if(left<right) swap(nums[right],nums[left]);}if(right>=k) return quicksort(mid,right,k);else return quicksort(right+1,r,k);}int findKthLargest(vector<int>& nums, int k) {this->nums=nums;return quicksort(0,nums.size()-1,nums.size()-k);}
};

具體方案:定下首個元素的值為mid,設置雙指針分別指向首個元素的前一位最后一個元素的后一位,當左指針在右指針左邊時,移動左指針到第一個大于mid的位置,移動右指針到第一個小于mid的位置,若左指針在右指針左邊,則交換兩者元素,循環以上。

循環最終結果:左指針指向從左往右第一個大于mid的元素,右指針指向從右往左第一個小于mid的元素,且左指針不在右指針左邊。

(選擇排序做法)繼續遞歸右指針往右部分的數組和右指針往左部分的數組。

(這道題做法)若右指針的位置在k右邊,則遞歸右指針往左部分,否則遞歸右指針往右部分。

初寫時犯了不少錯誤,也有很多問題:

錯誤一:最后將mid移至left的位置

一開始的想法是mid既然是中間就要移到中間的位置,然后若mid正好在k的位置就可以直接返回mid,這樣做很麻煩并且不一定正確。

錯誤二:將雙指針分別設在首個元素的后一位、最后一個元素

這樣做會忽略掉一些元素,這樣的話循環就不能先do再while了,可能會陷入死循環,總之比較麻煩。

錯誤三:最終以左節點作為分割線

大概就是把

if(right>=k) return quicksort(mid,right,k);else return quicksort(right+1,r,k);

寫成了:

if(left>=k) return quicksort(mid,left-1,k);else return quicksort(left,r,k);

其實現在也不是很明白為什么不能以左節點分割,我想可能是因為左指針最開始還要先經過mid,多了一次停留。

總之以后寫快排的時候注意這幾個地方就好了。

堆排序

堆排序做這題會更簡單。

之前不知道堆是什么,現在才知道是一種二叉樹,大根堆就是將大的數作為根節點。

class Solution {
public:void adjustheap(vector<int>& nums,int root){int left=root*2+1;int right=root*2+2;int maxx=root;if(left<nums.size()&&nums[left]>nums[maxx]) maxx=left;if(right<nums.size()&&nums[right]>nums[maxx]) maxx=right;if(maxx!=root){swap(nums[maxx],nums[root]);adjustheap(nums,maxx);}}void initheap(vector<int>& nums){for(int i=nums.size()/2-1;i>=0;i--){adjustheap(nums,i);}}int findKthLargest(vector<int>& nums, int k) {initheap(nums);for(int i=0;i<k-1;i++){nums[0]=-10001;adjustheap(nums,0);}return nums[0];}
};

這些函數包括初始化大根堆、調整大根堆的過程。

大根堆就是一個數組,只不過邏輯結構是二叉樹,所以不用建樹那些過程

初始化大根堆:

從最后一個非葉子節點(nums.size()/2-1)開始調整大根堆。

調整大根堆:

輸入root節點,比較root和左右節點,最大的節點若不是root則和root交換,然后遞歸調整最大那個節點。

這道題不需要進行堆排序,只要構建完大根堆不斷刪除最頂節點k-1步即可。

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

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

相關文章

【親測】Linux 使用 Matplotlib 顯示中文

文章目錄 安裝中文字體在Matplotlib中使用該字體來顯示中文 在 Linux 系統中使用 Matplotlib 繪制圖表時&#xff0c;如果需要顯示中文&#xff0c;可能會遇到中文字符顯示為方塊或者亂碼的問題。這是因為Matplotlib 默認使用的字體不支持中文。本文手把手帶你解決這個問題。 …

Redis Java 客戶端 之 SpringDataRedis

SpringDataRedis SpringData是Spring中數據操作的模塊&#xff0c;包含對各種數據庫的集成&#xff0c;其中對Redis集成模塊就叫做SpringDataRedis&#xff0c; 官方地址&#xff1a;https://spring.io/projects/spring-data-redis 特性&#xff1a; 提供了對不同Redis客戶端…

數字化轉型:重構生存邏輯,不止系統升級

數字化轉型不過是升級系統&#xff0c;砸了錢、耗了力&#xff0c;卻沒達到預期&#xff0c;競爭力也沒提升。實際上&#xff0c;數字化轉型是對企業生存邏輯的徹~底重構&#xff0c;關乎商業模式、運營流程等方方面面。? 很多企業覺得數字化轉型是 IT 部門的事&#xff0c;只…

C語言隊列的實現

目錄 ?編輯 &#xff08;一&#xff09;隊列的定義,初始化及創建結點 &#xff08;二&#xff09;入隊和出隊&#xff0c;以及取隊頭隊尾的數據 (三)銷毀隊列 隊列是指只允許在一端進行插入數據操作&#xff0c;在另?端進行刪除數據操作的特殊線性表&#xff0c;隊列具有先…

mapbox進階,使用本地dem數據,加載hillshade山體陰影圖層

????? 主頁: gis分享者 ????? 感謝各位大佬 點贊?? 收藏? 留言?? 加關注?! ????? 收錄于專欄:mapbox 從入門到精通 文章目錄 一、??前言1.1 ??mapboxgl.Map 地圖對象1.2 ??mapboxgl.Map style屬性1.3 ??hillshade 山體陰影圖層 api1.3.1 ??…

量子糾錯碼實戰:從Shor碼到表面碼

引言&#xff1a;量子糾錯的必要性 量子比特的脆弱性導致其易受退相干和噪聲影響&#xff0c;單量子門錯誤率通常在10?~10?量級。量子糾錯碼&#xff08;QEC&#xff09;通過冗余編碼測量校正的機制&#xff0c;將邏輯量子比特的錯誤率降低到可容忍水平。本文從首個量子糾錯…

10. git switch

基本概述 git switch是 Git 2.23 版本之后新增的命令&#xff0c;專門用于切換分支&#xff0c;目的是替代 git checkout 中與分支操作相關的功能&#xff0c;使命令語義更清晰、更安全。 基本用法 1.切換到已有分支 git switch <branch-name>常用選項 1.從當前分支…

LeetCode 熱題 100 堆

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

PIXOR:基于LiDAR的3D檢測模型解析

目錄 1、前言 2、PIXOR介紹 2.1. 什么是PIXOR&#xff1f; 2.2. PIXOR如何工作&#xff1f; 3、表現和應用 3.1、PIXOR的性能表現 3.2、PIXOR的應用場景 3.3、PIXOR的局限性與挑戰 4. PIXOR的未來展望 5. 結語 1、前言 自動駕駛技術正以前所未有的速度發展&#xff…

Vue中權限控制的方案

文章目錄 源碼&#xff1a;一、頁面級1.1、路由守衛1.2、動態路由 二、按鈕級別2.1、通過v-if來判斷2.2、通過組件包裹的方式來判斷2.3、通過自定義指令的方式 三、接口級別 源碼&#xff1a; https://gitee.com/liu-qiang-yyds/sysPermission 一、頁面級 1.1、路由守衛 前端…

【OSG學習筆記】Day 1: OSG初探——環境搭建與第一個3D窗口

什么是 OSG&#xff1f; 全稱&#xff1a;OpenSceneGraph&#xff08;開源場景圖&#xff09; 定位&#xff1a;一個基于 C/OpenGL 的高性能開源3D圖形開發工具包&#xff0c;專注于實時渲染和復雜場景管理。 核心思想&#xff1a;通過 場景圖&#xff08;Scene Graph&#xf…

Kubernetes 入門篇之網絡插件 calico 部署與安裝

在運行kubeadm init 和 join 命令部署好master和node節點后&#xff0c;kubectl get nodes 看到節點都是NotReady狀態&#xff0c;這是因為沒有安裝CNI網絡插件。 kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master Not…

游戲開發中 C#、Python 和 C++ 的比較

&#x1f3ac; Verdure陌矣&#xff1a;個人主頁 &#x1f389; 個人專欄: 《C/C》 | 《轉載or娛樂》 &#x1f33e; 種完麥子往南走&#xff0c; 感謝您的點贊、關注、評論、收藏、是對我最大的認可和支持&#xff01;?? 摘要&#xff1a; 那么哪種編程語言最適合游戲開發…

LabVIEW真空度監測與控制系統

開發了一種基于LabVIEW的真空度信號采集與管理系統&#xff0c;該系統通過圖形化編程語言實現了真空度的高精度測量和控制。利用LabVIEW的強大功能&#xff0c;研制了相應的硬件并設計了完整的軟件解決方案&#xff0c;以滿足工業應用中對真空度監測的精確要求。 項目背景 隨著…

checkra1n越獄出現的USB error -10問題解決

使用checkra1n進行越獄是出現&#xff1a; 解決辦法(使用命令行進行越獄)&#xff1a; 1. cd /Applications/checkra1n.app/Contents/MacOS 2. ./checkra1n -cv 3. 先進入恢復模式 a .可使用愛思助手 b. 或者長按home,出現關機的滑條&#xff0c;同時按住home和電源鍵&#…

spring boot 中 WebClient 與 RestTemplate 的對比總結

以下是 WebClient 與 RestTemplate 的對比總結&#xff0c;以純文本表格形式呈現&#xff1a; 核心特性對比 特性RestTemplateWebClient線程模型同步阻塞&#xff1a;每個請求占用線程&#xff0c;直到響應返回。異步非阻塞&#xff1a;基于事件循環&#xff0c;高效處理高并發…

深入淺出SPI通信協議與STM32實戰應用(W25Q128驅動)(實戰部分)

1. W25Q128簡介 W25Q128 是Winbond推出的128M-bit&#xff08;16MB&#xff09;SPI接口Flash存儲器&#xff0c;支持標準SPI、Dual-SPI和Quad-SPI模式。關鍵特性&#xff1a; 工作電壓&#xff1a;2.7V~3.6V分頁結構&#xff1a;256頁/塊&#xff0c;每塊16KB&#xff0c;共1…

STM32 HAL庫之EXTI示例代碼

外部中斷按鍵控制LED燈 在main.c中 HAL_Init(); 初始化Flash&#xff0c;中斷優先級以及HAL_MspInit函數&#xff0c;也就是 stm32f1xx_hal.c 中 HAL_StatusTypeDef HAL_Init(void) {/* Configure Flash prefetch */ #if (PREFETCH_ENABLE ! 0) #if defined(STM32F101x6) || …

查看手機在線狀態,保障設備安全運行

手機作為人們日常生活中不可或缺的工具&#xff0c;承載著溝通、工作、娛樂等多種功能。保障手機設備的安全運行是我們每個人都非常重要的任務&#xff0c;而了解手機的在線狀態則是其中的一環。通過挖數據平臺提供的在線查詢工具&#xff0c;我們可以方便快捷地查詢手機號的在…

Llama 4全面評測:官方數據亮眼,社區測試顯不足之處

引言 2025年4月&#xff0c;Meta正式發布了全新的Llama 4系列模型&#xff0c;這標志著Llama生態系統進入了一個全新的時代。Llama 4不僅是Meta首個原生多模態模型&#xff0c;還采用了混合專家(MoE)架構&#xff0c;并提供了前所未有的上下文長度支持。本文將詳細介紹Llama 4…