日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Leetcode4-寻找两个正序数组的中位数原理及代码实现

發(fā)布時間:2025/3/21 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Leetcode4-寻找两个正序数组的中位数原理及代码实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

LeetCode4 hard

題目

尋找兩個正序數(shù)組的中位數(shù)

給定兩個大小為m和n的正序(從小到大)數(shù)組nums1和nums2.請你找出這兩個正序數(shù)組的中位數(shù),并且要求算法時間復(fù)雜度為O(log(m+n)).

解題思路

1. 簡單算法 O(m+n)

將兩個數(shù)組合并成一個,利用自帶的排序函數(shù)使合并后的數(shù)組有序。根據(jù)下標(biāo)返回中位數(shù)。但這樣時間復(fù)雜度是O(m+n),不符合題目要求。

class Solution:#64ms 33.73% O(m+n)def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:nums1.extend(nums2)nums1.sort()length=len(nums1)if length%2==0:return (nums1[length//2-1]+nums1[length//2])/2return nums1[length//2]

2. 二分法 O(log(m+n))

如果對時間復(fù)雜度要求有l(wèi)og,通常需要用到二分查找。
尋找中位數(shù)的問題實質(zhì)上是尋找第k小的數(shù)。我們比較兩個數(shù)組中第k/2小的數(shù),較小的數(shù)及他之前的數(shù)一定不會是第k小的數(shù),這樣我們每次比較可以排除一半的數(shù),達到了O(log(m+n))的時間復(fù)雜度。當(dāng)然,有一些特殊情況需要單獨考慮。

class Solution:#56ms 66.72% O(log(m+n))def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:def getKthMin(k:int, nums1: List[int], nums2: List[int])->int:#特殊情況1,某一個數(shù)組為空,則直接在另一個數(shù)據(jù)找到第k小的值if not nums1:return nums2[k - 1]if not nums2:return nums1[k - 1]#特殊情況2,k==1即返回最小值if k==1:return nums1[0] if nums1[0]<=nums2[0] else nums2[0]#特殊情況3,第k//2個元素超過索引,則直接比較最后一個元素與另一個數(shù)據(jù)對應(yīng)元素,此時排除的元素個數(shù)是len(較短數(shù)組),而不是k//2nums11, nums22 = nums1, nums2if k//2>len(nums2):nums11, nums22 = nums2, nums1if k//2>len(nums11):if nums11[-1]<=nums22[len(nums11)-1]:k-=len(nums11)return nums22[k - 1]else:g=k-len(nums11)return getKthMin(g, nums11, nums22[len(nums11):])#正常情況,如果nums1的元素較小,則nums1位于比較位置之前的元素一定不是第k小的元素,被排除。下一次比較從nums1的下一個位置算起。if nums1[k//2-1]<=nums2[k//2-1]:g=k-k//2return getKthMin(g,nums1[k//2:], nums2)else:g=k-k//2return getKthMin(g, nums1, nums2[k//2:])#如果總長度為偶數(shù),中位數(shù)則為二者平均值length=len(nums1)+len(nums2)if length%2==0:return (getKthMin(length//2, nums1, nums2)+getKthMin(length//2+1, nums1, nums2))/2else:return getKthMin(length // 2 + 1, nums1, nums2)

總結(jié)

以上是生活随笔為你收集整理的Leetcode4-寻找两个正序数组的中位数原理及代码实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。