LeetCode刷題系列4

2021-09-28 20:22:45 字數 1797 閱讀 2670

給定兩個大小為 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 solution 

int 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 的小寫字母,以及字元 和 示例...