今日打卡,Leetcode第四題:尋找兩個正序數組的中位數,博主表示就會sorted

4. 尋找兩個正序數組的中位數

博主只會第一個暴力解法,然后將官網上的源碼上添加些注釋,嘗試理解,分下今日刷題記錄

題目描述

給定兩個大小分別為 mn 的正序(從小到大)數組 nums1nums2。請你找出并返回這兩個正序數組的 中位數

算法的時間復雜度應該為 O(log (m+n))

解法一:暴力合并法(不符合題目要求的時間復雜度)

這種方法最為直觀,但時間復雜度為 O((m+n)log(m+n)),不符合題目要求。

class Solution:def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:nums = sorted(nums1 + nums2)  # 合并并排序兩個數組n = len(nums)result = 0for i in range(n):result += nums[i]return result / n  # 這里實際上計算的是平均值而非中位數,正確的中位數計算應為:# 如果n為奇數,返回nums[n//2]# 如果n為偶數,返回(nums[n//2-1] + nums[n//2])/2

注意:上述代碼中計算的是平均值而非中位數。正確的中位數計算應該是:

if n % 2 == 1:return nums[n//2]
else:return (nums[n//2-1] + nums[n//2]) / 2

解法二:二分查找法(符合題目要求的時間復雜度)

這種方法的核心思想是將"尋找中位數"轉化為"尋找第k小的元素"的問題。

class Solution:def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:def getKthElement(k):"""- 主要思路:要找到第 k (k>1) 小的元素,那么就取 pivot1 = nums1[k/2-1] 和 pivot2 = nums2[k/2-1] 進行比較- 這里的 "/" 表示整除- nums1 中小于等于 pivot1 的元素有 nums1[0 .. k/2-2] 共計 k/2-1 個- nums2 中小于等于 pivot2 的元素有 nums2[0 .. k/2-2] 共計 k/2-1 個- 取 pivot = min(pivot1, pivot2),兩個數組中小于等于 pivot 的元素共計不會超過 (k/2-1) + (k/2-1) <= k-2 個- 這樣 pivot 本身最大也只能是第 k-1 小的元素- 如果 pivot = pivot1,那么 nums1[0 .. k/2-1] 都不可能是第 k 小的元素。把這些元素全部 "刪除",剩下的作為新的 nums1 數組- 如果 pivot = pivot2,那么 nums2[0 .. k/2-1] 都不可能是第 k 小的元素。把這些元素全部 "刪除",剩下的作為新的 nums2 數組- 由于我們 "刪除" 了一些元素(這些元素都比第 k 小的元素要小),因此需要修改 k 的值,減去刪除的數的個數"""index1, index2 = 0, 0  # 初始化兩個數組的起始索引while True:# 特殊情況處理if index1 == m:  # m是數組num1的長度,如果nums1已經全部被排除return nums2[index2 + k - 1]  # 直接返回nums2中的第k個元素if index2 == n:  #n是數組num2的長度 如果nums2已經全部被排除return nums1[index1 + k - 1]  # 直接返回nums1中的第k個元素if k == 1:  # 如果要找第1小的元素return min(nums1[index1], nums2[index2])  # 返回兩個數組當前位置的最小值# 正常情況處理newIndex1 = min(index1 + k // 2 - 1, m - 1)  # 計算nums1中的比較位置,防止越界newIndex2 = min(index2 + k // 2 - 1, n - 1)  # 計算nums2中的比較位置,防止越界pivot1, pivot2 = nums1[newIndex1], nums2[newIndex2]  # 取出比較值# 比較兩個數組的元素,排除較小元素所在的部分if pivot1 <= pivot2:  # 如果nums1的元素較小k -= newIndex1 - index1 + 1  # 更新k值,減去排除的元素個數index1 = newIndex1 + 1  # 更新nums1的起始位置else:  # 如果nums2的元素較小k -= newIndex2 - index2 + 1  # 更新k值,減去排除的元素個數index2 = newIndex2 + 1  # 更新nums2的起始位置m, n = len(nums1), len(nums2)  # 獲取兩個數組的長度totalLength = m + n  # 計算總長度# 根據總長度的奇偶性,計算中位數if totalLength % 2 == 1:  # 如果總長度為奇數return getKthElement((totalLength + 1) // 2)  # 返回中間的元素else:  # 如果總長度為偶數return (getKthElement(totalLength // 2) + getKthElement(totalLength // 2 + 1)) / 2  # 返回中間兩個元素的平均值

詳細解釋

二分查找法的核心思想

  1. 問題轉化:中位數可以轉化為找第k小的元素

    • 如果總長度為奇數,中位數是第(m+n+1)/2小的元素
    • 如果總長度為偶數,中位數是第(m+n)/2小和第(m+n)/2+1小的元素的平均值
  2. 二分排除法:每次比較兩個數組中第k/2個元素,排除較小值所在數組的前k/2個元素

算法流程圖解

假設有兩個數組:

  • nums1 = [1, 3, 5, 7, 9]
  • nums2 = [2, 4, 6, 8, 10]

要找這兩個數組合并后的中位數:

  1. 總長度為10,是偶數,需要找第5小和第6小的元素的平均值
  2. 尋找第5小的元素:
    • 比較nums1[5/2-1]=nums1[1]=3和nums2[5/2-1]=nums2[1]=4
    • 3<4,排除nums1的[1,3],k=3,nums1現在從索引2開始
    • 比較nums1[3/2-1+2]=nums1[3]=7和nums2[3/2-1]=nums2[0]=2
    • 7>2,排除nums2的[2],k=2,nums2現在從索引1開始
    • 比較nums1[2/2-1+2]=nums1[2]=5和nums2[2/2-1+1]=nums2[1]=4
    • 5>4,排除nums2的[4],k=1,nums2現在從索引2開始
    • k=1,返回min(nums1[2], nums2[2])=min(5,6)=5
  3. 尋找第6小的元素(類似過程):結果為6
  4. 中位數=(5+6)/2=5.5

時間復雜度分析

  • 每次操作會排除k/2個元素
  • 總共有m+n個元素,最多需要log(m+n)次操作
  • 因此時間復雜度為O(log(m+n)),符合題目要求

空間復雜度分析

  • 只使用了常數級別的額外空間
  • 空間復雜度為O(1)

總結

  1. 暴力合并法:簡單直觀但不符合題目要求
  2. 二分查找法:通過每次排除一部分元素,達到O(log(m+n))的時間復雜度
  3. 關鍵在于將"尋找中位數"轉化為"尋找第k小元素"的問題
  4. 通過比較兩個數組中第k/2個元素,每次可以排除至少k/2個元素

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

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

相關文章

Jouier 普及組十連測 R3

反思 首先&#xff0c;先悔恨一下這次的比賽成績。 這次比賽的教訓就是&#xff0c;簡單的題目一定要打不要被復雜的題面震懾到&#xff0c;以及變量名不能是保留字&#xff0c;如第一題的x1,y1&#xff0c;要開long long&#xff0c;計算好數據范圍&#xff0c;如第三第四題。…

Open CASCADE學習|非線性方程組求解技術詳解

引言 在幾何建模與工程計算中&#xff0c;非線性方程組的求解是常見的核心問題。Open CASCADE&#xff08;以下簡稱OCC&#xff09;作為開源的幾何建模內核&#xff0c;提供了豐富的數學工具庫&#xff0c;其中math_FunctionSetRoot類專為求解非線性方程組設計。本文將深入探討…

科技初創企業創新推動商業未來

在這個因變革而蓬勃發展的世界里&#xff0c;科技初創企業已成為各行業創新、顛覆與轉型的驅動力。這些雄心勃勃的企業正在重塑商業格局&#xff0c;挑戰既定規范&#xff0c;并不斷突破可能性的邊界。本文將深入探索科技初創企業的精彩領域&#xff0c;探討它們如何通過創新塑…

霍尼韋爾HMR2300-D00-485數字模塊

型號&#xff1a;HMR2300-D00-485 類型&#xff1a;數字通信模塊&#xff08;RS-485接口&#xff09; 制造商&#xff1a;霍尼韋爾&#xff08;Honeywell&#xff09;&#xff0c;隸屬于其工業自動化或樓宇自動化產品線。 典型用途&#xff1a; 用于擴展主控制器&#xff08;如…

如何在 Windows 11 或 10 上更改 WIFI 或以太網 MAC 地址?

無論你使用的是哪種操作系統,更改 MAC 地址在各種場景中都有其益處。每個網卡的 MAC 地址都是唯一的,由網絡適配器在出廠時就已經分配完成;它幫助系統在物理網絡上進行通信,并為其提供身份識別。然而,如果你出于某種合法原因想要更改 Windows 上的當前 MAC 地址,那么我們…

Python語法特點與編碼規范

注釋 單行注釋 把#號當做注釋符號 多行注釋 python中并沒有規定多行注釋標記&#xff0c;通常使用單引號作為多行注釋 中文注釋 規定文件所用編碼&#xff0c;當時是為解決python2不支持中文的問題 #codingutf-8代碼縮進 python采用代碼縮進和冒號區分代碼層次&#xff0c…

跟Gemini學做PPT:字號選擇

字號的選擇對于 PPT 的可讀性和視覺效果至關重要。以下是一些通用的建議和針對你具體情況的字號選擇指南&#xff1a; 通用字號選擇原則&#xff1a; 對比度&#xff1a; 文字顏色與背景顏色形成高對比度&#xff0c;確保易讀。字體&#xff1a; 選擇清晰、專業的字體&#x…

【JVM 03-JVM內存結構之-虛擬機棧】

虛擬機棧 筆記記錄 1. 定義1.1 演示棧幀 2. 特點3. 線程運行診斷3.1 案例1 cpu占用過多&解決3.2 案例2 程序運行很長時間沒有結果 4. 拓展知識&問題辨析4.1 棧的內存越大越好嘛&#xff1f;(不是)4.2 方法內的局部變量是否線程安全&#xff1f;(是線程安全的)4.2.1 局部…

文章記單詞 | 第104篇(六級)

一&#xff0c;單詞釋義 keyboard /?ki?b??rd/ n. 鍵盤underlying /??nd?r?la???/ adj. 潛在的&#xff1b;根本的&#xff1b;基礎的June /d?u?n/ n. 六月tactics /?tkt?ks/ n. 戰術&#xff1b;策略&#xff1b;手段south /sa?θ/ n./adj./adv. 南方&#x…

中宏立達與天空衛士達成戰略合作

戰略合作篇 中宏立達-天空衛士 2025年5月23日&#xff0c;中宏立達與天空衛士在中宏立達集團總部北京麗金智地中心正式簽署戰略合作協議。中宏立達總經理王博先生與天空衛士高級副總裁兼首席運營官鞏文堅先生代表雙方簽署協議。這標志著兩家領軍企業在數字安全領域的深度合作正…

RxJS 高階映射操作符詳解:map、mergeMap 和 switchMap

1. map 操作符 map 是最基本的轉換操作符&#xff0c;用于對 Observable 發出的每個值進行一對一轉換。 基本特點&#xff1a; 同步操作一對一轉換不改變 Observable 的發出時機 詳細示例&#xff1a; import { of } from rxjs; import { map } from rxjs/operators;// 示…

基于stm32的多旋翼無人機(Multi-rotor UAV based on stm32)

由于一直在調試本項目&#xff0c;好久沒有發文章&#xff0c;最近本項目的PID調試初見成效&#xff01;開始正文前首先感謝各位粉絲的支持&#xff0c;以及對本項目技術上支持的老師以及師兄&#xff0c;謝謝你們&#xff01; 對應源碼及文件&#xff1a;源碼及文件下載 基于…

量子傳感器:開啟微觀世界的精準探測

隨著量子技術的飛速發展&#xff0c;量子傳感器逐漸成為前沿科技領域的熱門研究方向。量子傳感器利用量子力學的特性&#xff0c;能夠實現對物理量的極高精度測量&#xff0c;其應用范圍涵蓋了基礎科學研究、醫學診斷、環境監測以及國防安全等多個領域。本文將深入探討量子傳感…

河道管網排口在線監測系統解決方案

一、方案概述 我國作為世界上河流數量最為豐富的國家之一&#xff0c;擁有眾多歷史悠久的壯闊江河流域。然而&#xff0c;伴隨經濟社會的迅猛發展&#xff0c;河湖管理與保護面臨諸多新挑戰&#xff0c;諸如河道干涸、湖泊萎縮、水環境惡化以及河湖功能退化等問題&#xff0c;對…

Foldseek快速蛋白質結構比對

1. 下載和安裝 Foldseek 如果只是單個蛋白質結構的序列比對&#xff0c;我們只需要用Foldseek 的網站服務 https://search.foldseek.com/search 上傳我們的蛋白質結構并選擇想要進行比對的數據庫即可&#xff0c;這里不做重點講解。做生物信息學研究&#xff0c;我們難免需要批…

宏山激光韓國釜山開放日圓滿舉行,服務本地化再提速

5月21日-22日&#xff0c;宏山激光在韓國釜山展廳舉辦了主題為“韓國本地服務領導者”的開放日活動&#xff0c;此次活動聚焦韓國市場&#xff0c;通過沉浸式參觀和深度交流&#xff0c;全面展示宏山激光本地化服務體系的建設成果&#xff0c;彰顯其服務本地、深耕市場的堅定決…

大模型「瘦身」指南:從LLaMA到MobileBERT的輕量化部署實戰

大模型「瘦身」指南&#xff1a;從LLaMA到MobileBERT的輕量化部署實戰 系統化學習人工智能網站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目錄 大模型「瘦身」指南&#xff1a;從LLaMA到MobileBERT的輕量化部署實戰摘要引言一、輕量化技術…

JavaScript篇:函數作用域與作用域鏈探秘

大家好&#xff0c;我是江城開朗的豌豆&#xff0c;一名擁有6年以上前端開發經驗的工程師。我精通HTML、CSS、JavaScript等基礎前端技術&#xff0c;并深入掌握Vue、React、Uniapp、Flutter等主流框架&#xff0c;能夠高效解決各類前端開發問題。在我的技術棧中&#xff0c;除了…

Robust Kernel Estimation with Outliers Handling for Image Deblurring論文閱讀

Robust Kernel Estimation with Outliers Handling for Image Deblurring 1. 論文的研究目標與實際問題意義1.1 研究目標1.2 實際問題與產業意義2. 論文的創新方法、模型與優勢2.1 核心思路2.2 關鍵公式與技術細節2.2.1 非線性模糊模型與能量函數2.2.2 中間潛像更新與IRLS2.2.3…

nginx配置跨域請求,后臺不用配置啦,完美

允許全部把域名改* server { listen 22222; server_name localhost; location / { if ($request_method OPTIONS) { add_header Access-Control-Allow-Origin http://localhost:8080; add_header Access-Control-Allow-Headers *; add_header Access-Control-…