刷題 兩個字串取中位數

2022-08-11 04:39:09 字數 3941 閱讀 3537

話不多說,我們先看題(很久沒有做題了,今天第一刷,嘻嘻嘻)

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

​ a[0], a[1], ..., a[i-1] | a[i], a[i+1], ..., a[m-1]

對於b也是當然

將兩個放在一起更加明顯了,就有思路啦!

把新的集合分別命名為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然後再考慮進製,需...