給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。
請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o(log(m + n))。
你可以假設 nums1 和 nums2 不會同時為空。
示例 1:
nums1 = [1, 3]
nums2 = [2]
則中位數是 2.0
示例 2:
nums1 = [1, 2]
nums2 = [3, 4]
則中位數是 (2 + 3)/2 = 2.5
def median(a, b):m,n = len(a), len(b)
if m > n:
a, b, m, n = b, a, n, m
if n == 0:
raise valueerror
if m == 0:
if n % 2 == 1:
return b[int(n/2)]
else:
return (b[n/2-1]+b[n/2]) / 2.0
imin, imax, half_len = 0, m, (m+n+1)/2
while imin <= imax:
i = int((imin + imax) / 2)
j = int(half_len - i)
if i < m and b[j-1] > a[i] and j > 0:
# i is too small, must increase it
imin = i+1
elif j < n and a[i-1] > b[j] and i > 0:
# i is too big, must decrease it
imax = i-1
else:
# i is perfect
if i == 0: max_of_left = b[j-1]
elif j == 0: max_of_left = a[i-1]
else: max_of_left = max(a[i-1], b[j-1])
if (m+n) % 2 == 1:
return max_of_left
if i == m: min_of_right = b[j]
elif j == n: min_of_right = a[i]
else: min_of_right = min(a[i], b[j])
return (max_of_left + min_of_right) / 2.0
class solutionint n = nums1.size();
int m = nums2.size();
int half = (n + m) / 2;
int low = 0;
int high = n;
while (low <= high)
}int u = low;
int v = half - low;
int l = max( u - 1 >= 0 ? nums1[u - 1] : int_min, v - 1 >= 0 ? nums2[v - 1] : int_min);
int r = min( u < n ? nums1[u] : int_max, v < m ? nums2[v] : int_max);
if ((n + m) % 2 == 1)
return r;
return (l + r) * 1.0 / 2;
}};
leetcode刷題系列
題目 輸入乙個整數,輸出該數二進位制表示中1的個數。其中負數用補碼表示。解題思路 如果乙個整數不為0,那麼這個整數至少有一位是1。如果我們把這個整數減1,那麼原來處在整數最右邊的1就會變為0,原來在1後面的所有的0都會變成1 如果最右邊的1後面還有0的話 其餘所有位將不會受到影響。舉個例子 乙個二進...
LeetCode刷題系列1
給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 ...
LeetCode刷題系列10
給你乙個字串 s 和乙個字元規律 p,請你來實現乙個支援 和 的正規表示式匹配。匹配任意單個字元 匹配零個或多個前面的那乙個元素 所謂匹配,是要涵蓋 整個 字串 s的,而不是部分字串。說明 s 可能為空,且只包含從 a z 的小寫字母。p 可能為空,且只包含從 a z 的小寫字母,以及字元 和 示例...