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 ...