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

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

  • 1. 題目描述
  • 2.詳細題解
  • 3.代碼實現
    • 3.1 Python
    • 3.2 Java

1. 題目描述

題目中轉:215. 數組中的第K個最大元素
在這里插入圖片描述

2.詳細題解

? ? 快速排序算法在每一輪排序中,隨機選擇一個數字 x x x,根據與 x x x的大小關系將要排序的數據分成獨立的兩個部分,其中一部分的所有數據都比 x x x小(不比 x x x大),另外一部分的所有數據比 x x x要大(不比 x x x小),此時一定可以確定 x x x的位置為 m i d mid mid,若該位置 m i d mid mid即為要查找的第 k k k元素,則已經找到答案,而不用關心左右兩個區間中的數字是否有序。
??具體的,在實現過程中,若該位置 m i d mid mid大于 k k k,說明 k k k在左區間,則遞歸左區間,否則遞歸右區間。
??該題代碼開發工作量略大,主要是邊界問題的處理具體。在Python方法一中忽略了子區間僅為兩個元素的情況,故造成錯誤;Python方法二和Java方法一為同一種算法代碼實現,提交均為超出時間限制,未通過測試案例均為同一個,根本原因在于數組中存在大量的相同元素時,劃分數組時未等分,以致于遞歸迭代深度太深,例如對于數組 [ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ] [1,1,1,1,1,1,1,1] [1,1,1,1,1,1,1,1],根據;Python方法二和Java方法一,初始化 l = 0 , r = 7 l=0,r=7 l=0,r=7,第一次劃分結果為 i = 7 , j = 0 i=7,j=0 i=7,j=0,以 j = 0 j=0 j=0劃分,對于測試未通過的案例,達到10萬級的數組長度,且幾乎所有數字均為 1 1 1,即為一個極端案例。【該題leetcode的官方題解非常清晰,建議仔細閱讀。】

3.代碼實現

3.1 Python

Python方法一:

class Solution:def findKthLargest(self, nums: List[int], k: int) -> int:n = len(nums)return self.quickSelect(nums, 0, n-1, n-k)def quickSelect(self, nums, l, r, k):i, j = l+1, rwhile i < j:while i < r and nums[i] <= nums[l]:i += 1while j > l and nums[j] >= nums[l]:j -= 1if i>=j:breaknums[i], nums[j] = nums[j], nums[i]nums[l], nums[j] = nums[j], nums[l]if k == j:return nums[j]elif k < j:return self.quickSelect(nums, l, j-1, k)else:return self.quickSelect(nums, j+1, r, k)

在這里插入圖片描述
Python方法二:

class Solution:def findKthLargest(self, nums: List[int], k: int) -> int:n = len(nums)return self.quickSelect(nums, 0, n-1, n-k)def quickSelect(self, nums, l, r, k):i, j = l+1, rwhile l < r:while i < r and nums[i] <= nums[l]:i += 1while j > l and nums[j] >= nums[l]:j -= 1if i>=j: breaknums[i], nums[j] = nums[j], nums[i]nums[l], nums[j] = nums[j], nums[l]if k == j:return nums[j]elif k < j:return self.quickSelect(nums, l, j-1, k)else:return self.quickSelect(nums, j+1, r, k)

在這里插入圖片描述
Python方法三:

class Solution:def findKthLargest(self, nums: List[int], k: int) -> int:n = len(nums)return self.quickSelect(nums, 0, n-1, n-k)def quickSelect(self, nums, l, r, k):if l == r:return nums[k]i, j, key = l-1, r+1, nums[l]while i < j:i += 1while nums[i] < key:i += 1j -= 1while nums[j] > key:j -= 1if i < j: nums[i], nums[j] = nums[j], nums[i]if k <= j:return self.quickSelect(nums, l, j, k)else:return self.quickSelect(nums, j+1, r, k)

在這里插入圖片描述

3.2 Java

Java方法一:

class Solution {public int findKthLargest(int[] nums, int k) {int n = nums.length;return quickSelect(nums, 0, n-1, n-k);}public int quickSelect(int[] nums, int l, int r, int k){int i = l+1, j = r;while (l < r){while (i < r && nums[i] <= nums[l]){i++;}while (j > l && nums[j] >= nums[l]){j--;}if (i>=j){break;}int tmp = nums[i];nums[i] = nums[j];nums[j] = tmp;}int tmp = nums[l];nums[l] = nums[j];nums[j] = tmp;if (j==k){return nums[j];}else if (k < j){return quickSelect(nums, l, j-1, k);}else{return quickSelect(nums, j+1, r, k);}}
}   

在這里插入圖片描述
Java方法二:

class Solution {public int findKthLargest(int[] nums, int k) {int n = nums.length;return quickSelect(nums, 0, n - 1, n - k);}public int quickSelect(int[] nums, int l, int r, int k) {if (l == r) return nums[k];int key = nums[l], i = l - 1, j = r + 1;while (i < j) {do i++; while (nums[i] < key);do j--; while (nums[j] > key);if (i < j){int tmp = nums[i];nums[i] = nums[j];nums[j] = tmp;}}if (k <= j) return quickSelect(nums, l, j, k);else return quickSelect(nums, j + 1, r, k);}
}

在這里插入圖片描述

??執行用時不必過于糾結,對比可以發現,對于python和java完全相同的編寫,java的時間一般是優于python的;至于編寫的代碼的執行用時擊敗多少對手,執行用時和網絡環境、當前提交代碼人數等均有關系,可以嘗試完全相同的代碼多次執行用時也不是完全相同,只要確保自己代碼的算法時間復雜度滿足相應要求即可,也可以通過點擊分布圖查看其它coder的code。

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

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

相關文章

PMP–知識卡片--PDCA循環

記憶 PDCA&#xff1a;計劃執行檢查調整&#xff0c;計劃觀察動作&#xff1b;plan do check action 定義 PDCA循環的含義是將質量管理分為四個過程&#xff0c;即計劃&#xff08;Plan&#xff09;、執行&#xff08;Do&#xff09;、檢查&#xff08;Check&#xff09;、處…

C++開發調試工具:GDB調試,windebug調試,adb調試

我們在C開發過程中時常避免不了要調試追蹤&#xff0c;一下介紹最主流的三種調試工具&#xff1a; 一.GDB調試 1.coredump文件&#xff1a; coredump文件是程序異常時系統產生的錯誤日志文件&#xff0c;即核心轉儲文件&#xff1b; 編譯一個debug程序&#xff0c;必須是debu…

使用 OpenCV 和 Python 進行車道檢測和物體檢測(YOLO)

本項目旨在開發一個集車道檢測與物體檢測功能于一體的智能視覺分析系統&#xff0c;利用先進的計算機視覺技術和深度學習模型&#xff0c;實現實時的道路場景理解和目標識別。系統主要依托OpenCV這一強大的計算機視覺庫&#xff0c;以及Python作為編程語言&#xff0c;融合了車…

MySQL索引教程(01):創建索引

文章目錄 MySQL 創建索引索引介紹MySQL CREATE INDEX 語法MySQL 索引類型MySQL CREATE INDEX 實例結論 MySQL 創建索引 對于一個具有大量數據行的表&#xff0c;如果你根據某個查詢條件檢索數據時很慢&#xff0c;可能是因為你沒有在檢索條件相關的列上創建索引。 索引類似于…

FPC生產工藝全流程詳解

FPC生產制作繁瑣而且難度較大&#xff0c;與普通PCB比較&#xff0c;FPC單位面積電路的造價高很多&#xff0c;但是&#xff0c;由于FPC優異的柔性、輕薄和可靠性等特性&#xff0c;給眾多領域的設備和產品提供了更廣泛的實現空間和新的設計方案&#xff0c;比如沉金板在電子、…

android的activty冷啟動和熱啟動差異是什么?

Android的Activity冷啟動和熱啟動之間存在顯著差異&#xff0c;這些差異主要體現在啟動過程、資源加載、組件初始化以及用戶體驗等方面。以下是對兩者差異的詳細分析&#xff1a; 一、定義與過程差異 冷啟動&#xff1a; 定義&#xff1a;冷啟動是指應用程序完全退出后&#…

Java需要英語基礎嗎?

Java編程語言本身并不要求必須有很強的英語基礎&#xff0c;因為Java的語法和邏輯是獨立于任何特定語言的。我收集歸類了一份嵌入式學習包&#xff0c;對于新手而言簡直不要太棒&#xff0c;里面包括了新手各個時期的學習方向編程教學、問題視頻講解、畢設800套和語言類教學&am…

android開發引入jar包

我在為一個安卓設備開發一個APP&#xff0c;設備的廠家給我提供了一個jar包&#xff0c;我應該如何把它引入到項目之中呢&#xff1f; 很慚愧我以前幾乎沒做過android的開發&#xff0c;在此之前這么一個簡單的問題也不會。 實踐 我隨手在Android studio中新建了一個項目。 你…

Java項目:基于SSM框架實現的共享客棧管理系統分前后臺【ssm+B/S架構+源碼+數據庫+畢業論文】

一、項目簡介 本項目是一套基于SSM框架實現的共享客棧管理系統 包含&#xff1a;項目源碼、數據庫腳本等&#xff0c;該項目附帶全部源碼可作為畢設使用。 項目都經過嚴格調試&#xff0c;eclipse或者idea 確保可以運行&#xff01; 該系統功能完善、界面美觀、操作簡單、功能…

Splunk Enterprise for Windows 未授權任意文件讀取漏洞復現(CVE-2024-36991)

0x01 產品簡介 Splunk Enterprise是一款功能強大的數據分析引擎,旨在從所有IT系統和基礎設施數據中提供數據搜索、報表和可視化展現。Splunk Enterprise能夠收集、索引和利用所有應用程序、服務器和設備(包括物理、虛擬和云中環境)生成的快速移動型計算機數據。它允許用戶從…

交易積累-比特幣

在某些情況下&#xff0c;由于監管限制或個人選擇&#xff0c;投資者可能會考慮購買與比特幣相關的替代投資產品&#xff0c;如比特幣礦業公司股票&#xff08;例如Marathon Digital Holdings, Inc.&#xff0c;股票代碼&#xff1a;MARA&#xff09;或加密貨幣交易平臺的股票&…

使用maven搭建一個SpingBoot項目

1.首先創建一個maven項目 注意選擇合適的jdk版本 2.添加依賴 2.在pom.xml中至少添加依賴 spring-boot-starter-web 依賴&#xff0c;目的是引入Tomcat&#xff0c;以及SpringMVC等&#xff0c;使項目具有web功能。 <!-- 引入 包含tomcat&#xff0c;SpringMVC&#xff0c…

【C++題解】1561. 買木頭

問題&#xff1a;1561. 買木頭 類型&#xff1a;省賽、數組問題、二分答案、貪心、2015江蘇省青少年信息學奧林匹克競賽復賽 題目描述&#xff1a; 有 n 個木材供應商&#xff0c;每個供貨商有長度相同一定數量的木頭。長木頭可以鋸短&#xff0c;但短木頭不能接長。有一個客…

web前端之上傳文件夾、webkitdirectory

MENU 前言element-ui寫法input寫法 前言 1、以下代碼只實現的單個文件夾的上傳&#xff0c;原本需求是實現選擇多個文件夾上傳&#xff0c;但是沒找到實現的方法。如果想實現多個文件夾上傳&#xff0c;可以給這些文件夾新建一個父級文件夾&#xff0c;點擊上傳的時候選擇父級文…

14-36 劍和詩人10 - 用LLM構建 AI 代理平臺

介紹 在當今快速發展的技術環境中&#xff0c;大型語言模型 (LLM) 和 AI 代理正在改變我們與信息交互、實現流程自動化以及應對不同行業復雜挑戰的方式。隨著這些強大的模型不斷發展&#xff0c;對能夠無縫集成和協調它們的強大平臺的需求變得越來越重要。 讓我們深入研究設計…

android2024 gradle8 Processor和ksp兩種編譯時注解實現

android編譯時注解&#xff0c;老生常談&#xff0c;外面的例子都是bindView&#xff0c;腦殼看疼了&#xff0c;自己學習和編寫下。 而且現在已經進化到kotlin2.0&#xff0c;google也逐漸放棄kapt&#xff0c;進入維護狀態。所以要好好看看本貼。 參考我的工程&#xff1a; h…

數據結構之算法的時間復雜度

1.時間復雜度的定義 在計算機科學中&#xff0c;算法的時間復雜度是一個函數&#xff0c;它定量描述了算法的運行時間。一個算法所花費的時間與其中語句的執行次數成正比列&#xff0c;算法中的基本操作的執行次數&#xff0c;為算法的時間復雜度 例1&#xff1a; 計算Func1…

Linux:ollama大模型部署

目錄 Ollama 是一個能在本地機器上輕松構建和運行大型語言模型的輕量級、可擴展框架&#xff0c;適用于多種場景&#xff0c;具有易于使用、資源占用少、可擴展性強等特點。 1.安裝下載ollama 2.為 Ollama 創建一個用戶 3.為ollama創建服務文件 4.啟動ollama服務 5.拉取語…

Java 家庭物聯網

家庭物聯網系統的代碼和說明&#xff0c;包括用戶認證、設備控制、數據監控、通知和警報、日志記錄以及WebSocket實時更新功能。 ### 項目結構 plaintext home-iot-system ├── backend │ └── src │ └── main │ └── java │ └…

圖書館數據倉庫

目錄 1.數據倉庫的數據來源為業務數據庫&#xff08;mysql&#xff09; 初始化腳本 init_book_result.sql 2.通過sqoop將mysql中的業務數據導入到大數據平臺&#xff08;hive&#xff09; 導入mysql數據到hive中 3.通過hive進行數據計算和數據分析 形成數據報表 4.再通過sq…