LeetCode算法題(Go語言實現)_49

題目

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

一、代碼實現(快速選擇算法)

import ("math/rand""time"
)func findKthLargest(nums []int, k int) int {rand.Seed(time.Now().UnixNano())return quickSelect(nums, 0, len(nums)-1, k)
}func quickSelect(nums []int, left, right, k int) int {if left == right {return nums[left]}pivotIndex := rand.Intn(right-left+1) + leftpivotVal := nums[pivotIndex]// 三路分區low, mid, high := left, left, rightfor mid <= high {if nums[mid] > pivotVal {nums[low], nums[mid] = nums[mid], nums[low]low++mid++} else if nums[mid] == pivotVal {mid++} else {nums[mid], nums[high] = nums[high], nums[mid]high--}}leftLength := low - leftif k <= leftLength {return quickSelect(nums, left, low-1, k)}midLength := high - low + 1if k <= leftLength+midLength {return pivotVal}return quickSelect(nums, high+1, right, k-(leftLength+midLength))
}

二、算法分析

1. 核心思路
  • 快速選擇算法:基于快速排序的分治思想,但每次僅遞歸處理包含目標的子數組。
  • 三路分區:將數組劃分為大于、等于、小于基準值的三部分,減少不必要的遞歸。
  • 隨機基準:隨機選擇基準值避免最壞情況,確保平均時間復雜度為O(n)。
2. 關鍵步驟
  1. 隨機基準選擇:隨機選取一個元素作為基準值pivotVal
  2. 三路分區操作
    • low指針左側元素均大于pivotVal
    • mid遍歷數組,將元素分類到對應區域。
    • high指針右側元素均小于pivotVal
  3. 遞歸決策
    • 若左區長度≥k,遞歸處理左區。
    • 若k在左區和中區總長內,直接返回pivotVal
    • 否則遞歸處理右區,調整k值。
3. 復雜度
指標說明
時間復雜度O(n)平均情況,每次處理規模減半
空間復雜度O(log n)遞歸調用棧深度(最壞O(n),隨機化避免)

三、圖解示例

在這里插入圖片描述

四、邊界條件與擴展

1. 特殊場景驗證
  • 全相同元素:如[3,3,3], k=2,直接返回3。
  • k=1或k=n:處理最大或最小元素。
  • 逆序/順序數組:隨機基準確保效率。
2. 擴展應用
  • 前k大元素:修改返回邏輯收集元素。
  • 流式數據:結合堆結構處理動態數據。
  • 多維數據:定義合適比較規則處理復雜結構。
3. 多語言實現
import randomdef findKthLargest(nums, k):def quick_select(left, right, k):if left == right:return nums[left]pivot_index = random.randint(left, right)pivot_val = nums[pivot_index]low, mid, high = left, left, rightwhile mid <= high:if nums[mid] > pivot_val:nums[low], nums[mid] = nums[mid], nums[low]low += 1mid += 1elif nums[mid] == pivot_val:mid += 1else:nums[mid], nums[high] = nums[high], nums[mid]high -= 1if k <= low - left:return quick_select(left, low-1, k)elif k <= (low - left) + (high - low +1):return pivot_valelse:return quick_select(high+1, right, k - (low - left + high - low +1))return quick_select(0, len(nums)-1, k)
import java.util.Random;public class Solution {private static final Random rand = new Random();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];int pivotIndex = rand.nextInt(right - left + 1) + left;int pivotVal = nums[pivotIndex];int low = left, mid = left, high = right;while (mid <= high) {if (nums[mid] > pivotVal) {swap(nums, low++, mid++);} else if (nums[mid] == pivotVal) {mid++;} else {swap(nums, mid, high--);}}int leftLen = low - left;if (k <= leftLen) return quickSelect(nums, left, low - 1, k);int midLen = high - low + 1;if (k <= leftLen + midLen) return pivotVal;return quickSelect(nums, high + 1, right, k - (leftLen + midLen));}private void swap(int[] nums, int i, int j) {int temp = nums[i];nums[i] = nums[j];nums[j] = temp;}
}

五、總結與優化

1. 算法對比
方法優勢適用場景
快速選擇平均O(n)大規模數據求Top k
適合動態數據實時處理流數據
排序后取數實現簡單小規模數據
2. 工程優化
  • 尾遞歸優化:減少遞歸棧深度。
  • 迭代實現:改用循環結構避免棧溢出。
  • 內存優化:處理原數組避免額外空間。
3. 擴展方向
  • 并行處理:多線程加速分區過程。
  • 適應性優化:根據數據分布自動選擇策略。
  • 穩定性增強:處理元素相等時的穩定性需求。

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

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

相關文章

【HCIA】簡易的兩個VLAN分別使用DHCP分配IP

前言 之前我們通過 靜態ip地址實現了Vlan間通信 &#xff0c;現在我們添加一個常用的DHCP功能。 文章目錄 前言1. 配置交換機2. 接口模式3. 全局模式后記修改記錄 1. 配置交換機 首先&#xff0c;使用DHCP&#xff0c;需要先啟動DHCP服務&#xff1a; [Huawei]dhcp enable I…

【技術派后端篇】技術派通用敏感詞替換:原理、實現與應用

在當今互聯網環境下&#xff0c;數據脫敏對于國內的互聯網企業而言已經成為一項標配。這不僅是為了滿足合規性要求&#xff0c;更是保障用戶信息安全和企業聲譽的重要舉措。本文將深入探討技術派中實現數據脫敏的關鍵技術——通用敏感詞替換&#xff0c;從算法原理到具體實現&a…

Android RK356X TVSettings USB調試開關

Android RK356X TVSettings USB調試開關 平臺概述操作-打開USB調試實現源碼補充說明 平臺 RK3568 Android 11 概述 RK3568 是瑞芯微&#xff08;Rockchip&#xff09;推出的一款高性能處理器&#xff0c;支持 USB OTG&#xff08;On-The-Go&#xff09;和 USB Host 功能。US…

Microsoft Edge for linux debian

下載地址 https://www.microsoft.com/en-us/edge/download?formMA13FJ 安裝 # 下載安裝包 wget https://packages.microsoft.com/repos/edge/pool/main/m/microsoft-edge-stable/microsoft-edge-stable_135.0.3179.85-1_amd64.deb?brandM102 # 安裝 sudo dpkg -i microsoft…

typedef MVS_API CLISTDEF0IDX(ViewScore, IIndex) ViewScoreArr;

查找 MVS_API 定義 我們沒有在 List.h 文件中找到 MVS_API 的定義。MVS_API 很可能在 MVS 庫的其他地方定義。一般來說&#xff0c;MVS_API 是控制 OpenMVS 庫導入導出的宏&#xff0c;通常會出現在 MVS 的頭文件中。為了回答這個問題&#xff0c;我可以提供 MVS 代碼中常見的…

5.4/Q1,GBD數據庫最新文章解讀

文章題目&#xff1a;The global burden of high BMI among adolescents between 1990 and 2021 DOI&#xff1a;10.1038/s43856-025-00838-2 中文標題&#xff1a;1990 年至 2021 年青少年高 BMI 的全球負擔 發表雜志&#xff1a;Commun Med 影響因子&#xff1a;1區&#xff…

【形式化驗證基礎】活躍屬性Liveness Property和安全性質(Safety Property)介紹

文章目錄 一、Liveness Property1、概念介紹2、形式化定義二、Safety Property1. 定義回顧2. 核心概念解析3. 為什么強調“有限前綴”4. 示例說明4.1 示例1:交通信號燈系統4.2 示例2:銀行賬戶管理系統5. 實際應用的意義三. 總結一、Liveness Property 1、概念介紹 在系統的…

Redis面試——常用命令

一、String &#xff08;1&#xff09;設置值相關命令 1.1.1 SET 功能&#xff1a;設置一個鍵值對&#xff0c;如果鍵已存在則覆蓋舊值語法&#xff1a; SET key value [EX seconds] [PX milliseconds] [NX|XX]EX seconds&#xff1a;設置鍵的過期時間為 seconds 秒 PX milli…

【Unity】使用Cinemachine+CharacterController實現第三人稱視角下的角色視角、移動和跳躍控制

1.初始配置 安裝Cinemachine插件給角色添加CharacterConroller創建Cinemachine-->Free Look Camera在Free Look Camera中調整參數&#xff0c;Y Axis勾選Inver&#xff0c;X Axis取消勾選InverFree Look Camera要看向角色 跟隨角色&#xff08;自行設置&#xff0c;我就不…

深入理解 DML 和 DQL:SQL 數據操作與查詢全解析

深入理解 DML 和 DQL&#xff1a;SQL 數據操作與查詢全解析 在數據庫管理中&#xff0c;SQL&#xff08;結構化查詢語言&#xff09;是操作和查詢數據的核心工具。其中&#xff0c;DML&#xff08;Data Manipulation Language&#xff0c;數據操作語言&#xff09; 和 DQL&…

MongoDB數據庫的安裝到入門使用詳細講解

本篇文章主要講解MongoDB的安裝使用教程及基礎的數據庫管理和操作能力的講解,通過本篇文章您可以快速的掌握對MongDB數據庫的基本認識及,基礎開發能力。 一、MongoDB介紹 MongoDB是一款免費開源的非關系型數據庫,該數據庫適應于復雜關系的存儲和管理,非常適合數據結構復雜…

git提交實現文件或目錄忽略

前言 開發中使用git下載項目代碼開發,存在不需要提交文件或目錄&#xff0c;這里記錄下ideajava項目開發添加以下配置可忽略不需要提交文件,以方便我們提交代碼時&#xff0c;查看及提交文件只涉及項目代碼修改文件。 git提交實現文件或目錄忽略 .gitignore 文件的內容列出了在…

go語言的八股文

1.go語言觸發異常的場景有哪些 運行時錯誤 1.空指針解引用&#xff1a;嘗試訪問一個未初始化的指針指向的內存&#xff0c;會導致程序崩潰并觸發異常。 2.數組越界訪問&#xff1a;試圖訪問數組中不存在的索引&#xff0c;比如數組長度為5&#xff0c;卻嘗試訪問索引為10的元素…

Ubuntu安裝MySQL步驟及注意事項

一、安裝前準備 1. 系統更新&#xff1a;在安裝 MySQL 之前&#xff0c;確保你的 Ubuntu 系統軟件包是最新的&#xff0c;這能避免因軟件包版本問題導致的安裝錯誤&#xff0c;并獲取最新的安全補丁。打開終端&#xff0c;執行以下兩條命令&#xff1a; sudo apt update sudo …

【愚公系列】《Python網絡爬蟲從入門到精通》054-Scrapy 文件下載

&#x1f31f;【技術大咖愚公搬代碼&#xff1a;全棧專家的成長之路&#xff0c;你關注的寶藏博主在這里&#xff01;】&#x1f31f; &#x1f4e3;開發者圈持續輸出高質量干貨的"愚公精神"踐行者——全網百萬開發者都在追更的頂級技術博主&#xff01; &#x1f…

2025最新︱中國信通院靜態應用程序安全測試(SAST)工具能力評估,懸鏡安全靈脈AI通過評估!

背景 研發運營安全&#xff08;DevSecOps&#xff09;從研發運營&#xff08;DevOps&#xff09;的概念延伸和演變而來&#xff0c;其核心理念是將安全貫穿從開發到運營的軟件開發生命周期的每一個環節&#xff0c;在每個階段自動實施安全措施&#xff0c;從而實現快速開發交付…

辛格迪客戶案例 | 浙江高跖醫藥委托生產質量管理協同(OWL MAH)項目

一、案例概述 浙江高跖醫藥科技股份有限公司是一家集“研、產、銷”為一體的專業化藥品持證企業。高跖醫藥自成立之初就建立并運行著一套相對完善的質量管理體系&#xff0c;涵蓋了藥品的研發、生產監管及銷售。高跖醫藥于2022年選擇實施了辛格迪的“委托生產質量管理協同解決…

【NLP 65、實踐 ? 基于Agent優化文章】

羈絆由我而起&#xff0c;痛苦也由我承擔 —— 25.4.18 一、?【核心函數】定義大模型調用函數 call_large_model prompt&#xff1a;用戶傳入的提示詞&#xff08;如 “請分析這篇作文的主題”&#xff09;&#xff0c;指導模型執行任務 client&#xff1a;Zhipu…

【鋰電池SOH估計】BP神經網絡鋰電池健康狀態估計,鋰電池SOH估計(Matlab完整源碼和數據)

目錄 效果一覽程序獲取程序內容研究內容基于BP神經網絡的鋰電池健康狀態估計研究摘要關鍵詞1. 引言1.1 研究背景1.2 研究意義1.3 研究目標2. 文獻綜述2.1 鋰電池SOH估計理論基礎2.2 傳統SOH估計方法2.3 基于BP神經網絡的SOH估計研究進展2.4 研究空白與創新點3. BP神經網絡原理3…

2025第十六屆藍橋杯python B組滿分題解(詳細)

目錄 前言 A: 攻擊次數 解題思路&#xff1a; 代碼&#xff1a; B: 最長字符串 解題思路&#xff1a; 代碼&#xff1a; C: LQ圖形 解題思路&#xff1a; 代碼&#xff1a; D: 最多次數 解題思路&#xff1a; 代碼&#xff1a; E: A * B Problem 解題思路&…