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