寻找两个正序数组的中位数Python解法
生活随笔
收集整理的這篇文章主要介紹了
寻找两个正序数组的中位数Python解法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
給定兩個大小分別為 m 和 n 的正序(從小到大)數組?nums1 和?nums2。請你找出并返回這兩個正序數組的 中位數 。
算法的時間復雜度應該為 O(log (m+n)) 。
例:
輸入:nums1 = [1,3], nums2 = [2] 輸出:2.00000 解釋:合并數組 = [1,2,3] ,中位數 2# 1 暴力解法:合并,排序,直接查找,時間復雜度O((m+n)log (m+n))
class Solution(object):def findMedianSortedArrays(self, nums1, nums2):""":type nums1: List[int]:type nums2: List[int]:rtype: float"""for i in range(len(nums2)):nums1.append(nums2[i])nums1.sort()num = len(nums1)k = int(num/2)if (num & 1) == 0:return ((nums1[k]+nums1[(k-1)])/2)else:return (nums1[k])# 2 合并兩個有序數組,只用合并到中值即可。時間復雜度O((m+n))
class Solution(object):def findMedianSortedArrays(self, nums1, nums2):""":type nums1: List[int]:type nums2: List[int]:rtype: float"""m = len(nums1)n = len(nums2)lens = m + nleft, right = -1, -1 # 分割線左右兩邊的值aStart, bStart = 0, 0 # 兩個數組的開始下標for i in range(lens//2 + 1): # 只用遍歷到中值即可left = right # 右邊界賦值給左邊界if aStart < m and (bStart >= n or nums1[aStart] < nums2[bStart]): # 1數組還有值,并且1數組當前下標對應的值小于2數組當前下標對應的值或者2數組已經遍歷完畢right = nums1[aStart] # 則將1數組當前下標對應的值賦給右邊界aStart += 1 # 下標右移一位,判斷下一個else: # 與上個判斷類似right = nums2[bStart]bStart += 1if (lens & 1) == 0: # 按位與運算判斷長度奇偶return (left+right)/2.0 # 為偶數的情況else:return right# 二分法,同樣查詢一半的值即可,每個數組判斷一半,將較小的一半直接過濾,因為是有序數組,直接判斷中值即可,不必一一比較,時間復雜度為O(log (m+n))
class Solution:def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:def getK(k): # k值,需要查詢的第k大的值id1, id2 = 0, 0 # 數組1的下標,數組2的下標while True:# 特殊情況if id1 == m: # 數組1全部在中值左邊return nums2[id2 + k - 1] # 在數組2的當前下標下直接加上剩余需要判斷的值if id2 == n: # 數組2全部在中值左邊return nums1[id1 + k - 1] # 在數組1的當前下標下直接加上剩余需要判斷的值if k == 1: # k等于1時表明已經排除了小于中值的值,直接返回當前下標中較小的一方即可return min(nums1[id1], nums2[id2])# 正常情況newid1 = min(id1 + k // 2 - 1, m - 1) # 數組1需要判斷的位置下標newid2 = min(id2 + k // 2 - 1, n - 1) # 數組2需要判斷的位置下標p1, p2 = nums1[newid1], nums2[newid2] # 判斷下標對應的值if p1 <= p2: # 若數組1的當前判斷值較小,則說明判斷下標以及之前的值全部都在中值左邊,全部排除k -= newid1 - id1 + 1 # 需要判斷的k值減少排除的值id1 = newid1 + 1 # 數組1從去除的下標后一位重新開始else: # 同理k -= newid2 - id2 + 1id2 = newid2 + 1m, n = len(nums1), len(nums2) # 數組1,數組2的長度Length = m + n # 總長度if Length % 2 == 1: # 若總數組長度為奇數return getK((Length + 1) // 2) # 直接返回中值下標對應的值else: # 若為偶數return (getK(Length // 2) + getK(Length // 2 + 1)) / 2 # 返回中值左右兩邊的值相加取平均三種方法,如果對時間復雜度沒有要求的話,暴力還是最通俗易懂,暴力yyds |?・ω・` )
總結
以上是生活随笔為你收集整理的寻找两个正序数组的中位数Python解法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 独一份!真我GT Neo5 SE配100
- 下一篇: 酷狗音乐主页背景图怎么设置