leetcode題 尋找兩個有序陣列的中位數

2022-05-07 01:39:08 字數 2907 閱讀 5464

成績不是很好,**本身寫的也很亂,本文只是提供一種解題思路。

要求兩有序陣列的中位數並不難,簡單粗暴的方法就是得到兩陣列合併後的新陣列,取其中位數即可,但是難度在於這個時間複雜度有限制,為 o(log(m + n))。

一看這個log,那麼很容易想到二分查詢演算法什麼的,而本文的解題過程也正是按照二分的思路來的。通過每次比較兩陣列的二分位點,來進行中位數的篩選。

例:有兩有序陣列l1=[1, 2, 6, 12, 34, 36, 39, 43, 51, 56],l2=[2, 11, 14, 45, 48, 49],要求中位數 。

設l為l1和l2合併後的有序陣列。那麼可以看出我們要找的中位數在l中的下標應為7、8

**實現過程有點曲折,經過幾次提交修修補補形成了以下這段**,寫的不太好,理解了以上的思路後大家可以自己實現。

class solution:

def findmediansortedarrays(self, nums1: list[int], nums2: list[int]) -> float:

l1 = nums1

l2 = nums2

m1 = (len(l1)+len(l2))//2

m2 = (len(l1)+len(l2))/2

m_idx = [m1-1, m1] if m1 == m2 else [m1]

be_num = m1 - (len(m_idx) - 1)

af_num = be_num

while be_num > 0 and af_num > 0 and len(l1) != 0 and len(l2) != 0:

low1, high1, low2, high2 = 0, len(l1) - 1, 0, len(l2) - 1

mid1 = (low1+high1)//2

mid2 = (low2+high2)//2

if l1[mid1] < l2[mid2]:

low1 = max(min(mid1 + m_idx[0]-(mid1+mid2), len(l1)-1,mid1+1), 0)

be_num -= low1

high2 = max(min(mid2 + m_idx[-1] - (mid1 + mid2 + 1), len(l2) - 1), mid2-1)

af_num -= len(l2) - high2 - 1

else:

low2 = max(min(mid2 + m_idx[0] - (mid1 + mid2), len(l2)-1, mid2+1), 0)

be_num -= low2

high1 = max(min(mid1 + m_idx[-1] - (mid1 + mid2 + 1), len(l1) - 1), mid1-1)

af_num -= len(l1) - high1 - 1

l1 = l1[low1:high1+1]

l2 = l2[low2:high2+1]

m_idx = [be_num] if len(m_idx) == 1 else [be_num, be_num + 1]

newlist =

while len(l1) != 0 and len(l2) != 0:

if l1[0] < l2[0]:

l1.remove(l1[0])

else:

l2.remove(l2[0])

newlist.extend(l1)

newlist.extend(l2)

if be_num == 0 and af_num == 0:

newlist = newlist

elif be_num == 0 and af_num != 0:

newlist = newlist[:-af_num]

elif be_num != 0 and af_num == 0:

newlist = newlist[be_num:]

else:

newlist = newlist[be_num:-af_num]

# elif be_num == 0:

# newlist = newlist[:-af_num]

# elif af_num == 0:

# newlist = newlist[be_num+1:]

return sum(newlist)/len(newlist)

LeetCode刷題 尋找兩個有序陣列的中位數

給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。nums1 1,3 nums2 2 則中位數是 2.0 nums1 1,2 nums2 3,4 ...

leetcode尋找兩個有序陣列的中位數

給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0 示例 2 nums1 1,2 ...

LeetCode 尋找兩個有序陣列的中位數

給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0 示例 2 nums1 1,2 ...