成績不是很好,**本身寫的也很亂,本文只是提供一種解題思路。
要求兩有序陣列的中位數並不難,簡單粗暴的方法就是得到兩陣列合併後的新陣列,取其中位數即可,但是難度在於這個時間複雜度有限制,為 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 ...