尋找兩個有序陣列的中位數(LeetCode)
想法如下:
當數的個數為奇數時,中位數就這一堆已經排好序的數最中間那一個
當數的個數為偶數時,中位數就是中間那兩個數的平均數
class Solution:
def findMedianSortedArrays(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: float
"""
lis = []#將nums1和nums2重新進行排序放進lis中
j = 0
k = 0
n = len(nums1)
m = len(nums2)
if(n == 0):#nums1為空時,直接在num2中返回
if(m%2==0):
i = int(m/2)
return (nums2[i]+nums2[i-1])/2
else:
return nums2[int(m/2)]
elif(m == 0):#同上理
if(n%2==0):
i = int(n/2)
return (nums1[i]+nums1[i-1])/2
else:
return nums1[int(n/2)]
for i in range(0,n+m):#因為nums1和num2已經分別排序好了,所以n+m的複雜度已經夠用
if(j < n and k < m):#保證下標沒有越界
if(nums1[j]<=nums2[k]):
lis.append(nums1[j])
j = j + 1
else:
lis.append(nums2[k])
k = k + 1
elif(j==n):#nums1已經全部放進了lis,現在只需要放nums2就行了
lis.append(nums2[k])
k = k + 1
elif(k==m):#同上理
lis.append(nums1[j])
j = j + 1
if((n+m)%2==0):
i = int((n+m)/2)
return (lis[i]+lis[i-1])/2
else:
return lis[int(len(lis)/2)]
'''
第一次用LeetCode,不太習慣。然後因為資料型別的問題,困擾了一會。
Python寫程式的毛病多,在IDLE上寫好了,放在LeetCode裡面就會縮排不對。。
然後對比了一下我的答案和官方的答案。
官方給出的時間複雜度是,而我的是O(m+n)
官方給出的時間複雜度是O(1),而我的還是O(m+n)
(看錯題目。。它要求複雜的是O(log(min(m,n)))。。而我就直接做了。。)
可以在兩個數組裡各設定一個從零開始的下標,然後也是通過對比決定下標的移動
當m+n是奇數時,就執行到i<(m+n)/2
當m+n是偶數時,就執行到i<(m+n)/2+1
這樣時間會變短,空間複雜度也下降到O(1)
'''