力扣刷題 4. 尋找兩個正序陣列的中位數
阿新 • • 發佈:2021-06-11
兩種方法都能通過,但是排序的複雜度肯定不滿足題目要求的。第二種我不知道是不是滿足了複雜度要求,程式碼有點多,不過也還容易能看懂嘍
class Solution: def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float: # reslist = nums1 # reslist.extend(nums2) #合併陣列,extend()函式無返回值,謹記 # reslist.sort() #排序 # n=len(reslist) # if n%2==0: #找中位數 # return (reslist[n//2-1]+reslist[n//2])/2 # else: # return reslist[n//2] #這個複雜度有點高,不滿足O(log(m+n)) m,n=len(nums1),len(nums2) i, j = 0, 0 cout = -1 if (m+n)%2==0: #合併後的長度是偶數 left_index = (m+n)//2-1 #確認左右的下標是多少 right_index = (m+n)//2 while cout<=right_index: #直到找到右下標這麼多 if i<m and j<n: #兩個陣列都還有數那就要做一點比較,小的往後移,同時判斷個數有沒有到左下標和右下標,做記錄 if nums1[i]>nums2[j]: cout +=1 if cout==left_index: #如果已經找到了左下標,那要記錄一下 left=nums2[j] if cout==right_index: #如果已經找到了右下標,那可以配合左下標返回了 right=nums2[j] return (left+right)/2 j +=1 else: cout +=1 if cout==left_index: left=nums1[i] if cout==right_index: right=nums1[i] return (left+right)/2 i +=1 elif j<n: #只有nums2有數字了 cout +=1 if cout==left_index: left=nums2[j] if cout==right_index: right=nums2[j] return (left+right)/2 j +=1 else: #只有nums1有數字了 cout +=1 if cout==left_index: left=nums1[i] if cout==right_index: right=nums1[i] return (left+right)/2 i +=1 else: #合併後的長度是奇數 mid=(m+n)//2 #確認中位數下標 while cout<=mid: if i<m and j<n: if nums1[i]>nums2[j]: cout +=1 if cout==mid: return nums2[j] j +=1 else: cout +=1 if cout==mid: return nums1[i] i +=1 elif j<n: cout +=1 if cout==mid: return nums2[j] j +=1 else: cout +=1 if cout==mid: return nums1[i] i +=1