二 Leetcode演算法尋找兩個有序陣列的中位數

2021-10-01 18:02:28 字數 3281 閱讀 9834

1、題目

給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。 請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o(log(m + n))。 你可以假設 nums1 和 nums2 不會同時為空。

nums1 = [1, 3]

nums2 = [2]

則中位數是 2.0

nums1 = [1, 2]

nums2 = [3, 4]

則中位數是 (2 + 3)/2 = 2.5

2、分析

是將兩個已經排序的列表進行合併,並找到中位數,但是題目要求了時間複雜度,所以需要在合併時排序方面進行選擇,log首先會想到二分法,這樣的話不會對全部的資料進行查詢,這樣時間複雜度會比較小,但是我在這裡根據問題使用了類似二分法的改進版。每次去判斷最後一位是否是乙個小值,然後將之後的數全部合併,這樣的話會節省大量的判斷的時間,當然這裡也可以使用sorted函式,這是我一開始沒有想到的,最後發現使用sorted函式得分卻是非常的高。

3、**

class

solution

:def

findmediansortedarrays

(self, nums1: list[

int]

, nums2: list[

int])-

>

float

: x, y =0,

0 l =

len(nums1)if(

len(nums1)==0

)or(len

(nums2)==0

):iflen

(nums1)==0

:return

(nums2[

int(

len(nums2)/2

)]+ nums2[

int(

len(nums2)/2

-1)]

)/2if

len(nums2)&1

==0else nums2[

int(

len(nums2)/2

-0.5)]

iflen

(nums2)==0

:return

(nums1[

int(

len(nums1)/2

)]+ nums1[

int(

len(nums1)/2

-1)]

)/2if

len(nums1)&1

==0else nums1[

int(

len(nums1)/2

-0.5)]

while

true

:# 全部插入到 nums1

if nums1[x]

> nums2[y]

:

nums1.insert(x, nums2[y]

) y +=

1if x+1==

len(nums1)

: x = x

else

: x = x+1if

len(nums1)

== l +

len(nums2)

:# **

break

# 這裡**的實現感覺是非常重要的,每次去判斷最後一位是否是最小值

# 然後將未插入的元素全部插入到這個值的後面

# 極大的減少了判斷元素的時間

if nums1[-1

]<= nums2[y]

:

nums1 = nums1 + nums2[y:

]return

(nums1[

int(

len(nums1)/2

)]+ nums1[

int(

len(nums1)/2

-1)]

)/2if

len(nums1)&1

==0else nums1[

int(

len(nums1)/2

-0.5

)]

class

solution

:def

findmediansortedarrays

(self, nums1: list[

int]

, nums2: list[

int])-

>

float

:# 這裡只是用三行**就實現了要求

# sorted使用的是 timsort是乙個穩定的排序函式,時間複雜度為 nlog(n)

nums1 = nums1 + nums2

nums1 =

sorted

(nums1)

return

(nums1[

int(

len(nums1)/2

)]+ nums1[

int(

len(nums1)/2

-1)]

)/2if

len(nums1)&1

==0else nums1[

int(

len(nums1)/2

-0.5

)]

4、結果

# 第一種方法

執行用時 :

108 ms, 在所有 python3 提交中擊敗了88.50

% 的使用者

記憶體消耗 :

12.9 mb, 在所有 python3 提交中擊敗了99.43

%的使用者

# 第二種方法

執行用時 :

104 ms, 在所有 python3 提交中擊敗了94.16

% 的使用者

記憶體消耗 :

12.9 mb, 在所有 python3 提交中擊敗了99.43

%的使用者

5、改進

第一種感覺在判斷一方為空時占用的時間比較多,沒有將這一步的計算與大眾的資料整合在一起,應該將if判斷的**優化一下,可能時間複雜度會更小,當然執行的用時也是根據隨機資料隨機計算的,不過在資料量小的情況下應該會比二分法速度要快。

望您:

「情深不壽,強極則辱,謙謙君子,溫潤如玉」。

演算法 尋找兩個單項鍊表的交點

問題 尋找兩個單項鍊表的交點。輸入 兩個帶空頭結點的單向鍊錶 輸出 如果有相交的節點,輸出節點值 如果沒有,列印 沒有找到相交節點 好吧回頭看了一下好像這個方法是錯的。這題原理很簡單,首先是遍歷兩個鍊錶,獲取它們的長度 然後求出它們的長度差 difference 讓長的乙個鍊錶先前進differen...

leetcode尋找兩個有序陣列的中位數

給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0 示例 2 nums1 1,2 ...

LeetCode 尋找兩個有序陣列的中位數

給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0 示例 2 nums1 1,2 ...