LeetCode 尋找兩有序陣列中位數

2021-09-17 05:29:13 字數 1966 閱讀 4503

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

第乙個版本
public

double

findmediansortedarrays

(int

nums1,

int[

] nums2)

if(null == nums2 || nums2.length ==0)

int[

] nums =

newint

[nums1.length + nums2.length]

;// 都不為空

int indx1 =0;

int indx2 =0;

int idx =0;

// 當全部都還沒取完

while

(indx1 != nums1.length && indx2 != nums2.length)

else}if

(indx1 != nums1.length)}if

(indx2 != nums2.length)

}for

(int i =

0; i < idx; i++

)return

getnum

(nums);}

private

double

getnum

(int

num)

這個版本浪費了很多空間,可以將空間複雜度降到o(1),也就是優化後的版本。

優化版本

public

double

findmediansortedarrays

(int

nums1,

int[

] nums2)

if(null == nums2 || nums2.length ==0)

// 找下標

int totallen = nums1.length + nums2.length;

boolean isodd =

(totallen &1)

>0;

int thefisrtposition =

((totallen +1)

>>1)

-1;// 假設已經排序,這是

// 都不為空

int indx1 =0;

int indx2 =0;

int startindex =-1

;// 指向上乙個虛擬陣列中的下標

// 當全部都還沒取完

int tmp =0;

while

(indx1 < nums1.length && indx2 < nums2.length && startindex < thefisrtposition)

else

startindex++;}

// 計數到thefirstidx,或者存在乙個陣列用完,找到接下來的兩個

if(startindex == thefisrtposition)

else

// 直接就可以return了,找到接下來兩個該放的數值

}else

else}}

private

double

getnum

(int

num)

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

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

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