話不多說,我們先看題(很久沒有做題了,今天第一刷,嘻嘻嘻)
給定兩個大小為 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
拿到題之後,我以為是兩個陣列,分別取中位數然後相加除二就好了...
好吧,我以後看題要仔細一點了...
沒什麼可以說的,先來wawawa三連發,真爽
然後,我就把這兩個放進乙個陣列然後判斷奇偶性輸出就ok了
class solution:
def findmediansortedarrays(self, nums1: list[int], nums2: list[int]) -> float:
lenth1 = len(nums1)
lenth2 = len(nums2)
lenth = lenth1 + lenth2
i, j = 0, 0
p1, p2 = 0, 0
nums = [0] * (lenth)
if lenth1 == 0 and lenth2 == 0:
return
elif lenth1 == 0:
nums = nums2
elif lenth2 == 0:
nums = nums1
else:
for index in range(lenth):
if nums1[i] <= nums2[j] and p1 == 0:
nums[index] = nums1[i]
if i != lenth1-1:
i += 1
else:
p1 = 1
elif nums1[i] <= nums2[j] and p1 == 1:
nums[index] = nums2[j]
if j != lenth2-1:
j += 1
elif nums1[i] > nums2[j] and p2 == 0:
nums[index] = nums2[j]
if j != lenth2 -1:
j += 1
else:
p2 = 1
else:
nums[index] = nums1[i]
if i != lenth1-1:
i += 1
# print(nums)
if lenth%2 == 1:
return nums[int(lenth/2)]
else:
return (nums[int(lenth/2)] + nums[int(lenth/2)-1])/2
nums1 =
nums2 =
sol = solution()
print(sol.findmediansortedarrays(nums1, nums2))
好了,成功通過,結束了,nice!
睡了睡了,晚安
不對啊,這道題不是困難的麼,我後來去看了看題解,emmm...
果然用到了二分查詢的方法,覺得挺有意思的,把兩個陣列分成了4部分來查詢,在這裡ma一下
將乙個集合劃分為兩個長度相等的子集,其中乙個子集中的元素總是大於另乙個子集中的元素。
首先,讓我們在任一位置 i,將 a 劃分成兩個部分:
left_a | right_a
a[0], a[1], ..., a[i-1] | a[i], a[i+1], ..., a[m-1]
我們能夠得到
left_a | right_a對於b也是當然 a[0], a[1], ..., a[i-1] | a[i], a[i+1], ..., a[m-1]
將兩個放在一起更加明顯了,就有思路啦!
把新的集合分別命名為left_part 和right_part:
left_part | right_part
a[0], a[1], ..., a[i-1] | a[i], a[i+1], ..., a[m-1]
b[0], b[1], ..., b[j-1] | b[j], b[j+1], ..., b[n-1]
median = (left_part+right_part)/2
我們能夠得出的條件:
i+j=n+m-i-j(假設這幾個部分長度相同,設n>=m,使j不為負數)然後就是簡單的二分查詢的步驟了,這裡就不多說了,直接上**了b[j-1]a[i-1]
class solution:
def findmediansortedarrays(self, a: list[int], b: list[int]) -> float:
m, n = len(a), len(b)
if m == 0 and n == 0:
return
if n == 0:
if m%2 == 1:
return a[int(m/2)]
else:
return (a[int(m/2)]+a[int(m/2)-1])/2
if m == 0:
if n%2 == 1:
return b[int(n/2)]
else:
return (b[int(n/2)]+b[int(n/2)-1])/2
if m > n:
a, b, m, n = b, a, n, m
imin, imax, half_len = 0, m, int((m + n + 1) / 2)
while imin <= imax:
i = int((imin + imax) / 2)
j = half_len - i
if i < m and b[j-1] > a[i]:
imin = i + 1
elif i > 0 and a[i-1] > b[j]:
imax = i - 1
else:
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
a =
b =
sol = solution()
print(sol.findmediansortedarrays(a,b))
今天是第一天,以後繼續保持! 連線兩個字串
include include void main char lianjie char a 30 char b 30 原型 extern char strcat char dest,char src 用法 include 功能 把src所指字串新增到dest結尾處 覆蓋dest結尾處的 0 並新增 ...
交換兩個字串
交換兩個字串,原來的字串分別為 學生 和 好 字串輸出顯示為 學生好 交換後輸出顯示為 好學生 include using namespace std int main char c1 5 學生 char c2 3 好 char m,n,t m c1 n c2 cout 交換前 m n n t co...
兩個字串相乘
先附上一張演算法圖 解釋 123 456 首先拿出1和456相乘,儲存到陣列1 2 3 的位置,然後拿出2和456相乘2 3 4的位置,依次類推,直到第乙個字串遍歷完 然後將他們相加,依次存到陣列中 實現如下 int j 0 int resindex 0 for int i 0 i然後再考慮進製,需...