每天一到演算法題之 尋找兩個正序陣列的中位數

2021-10-10 11:22:59 字數 1676 閱讀 9145

題目

給定兩個大小為 m 和 n 的正序(從小到大)陣列 nums1 和 nums2。請你找出並返回這兩個正序陣列的中位數。

高階:你能設計乙個時間複雜度為 o(log (m+n)) 的演算法解決此問題嗎?

示例 1:

輸入:nums1 = [1,3], nums2 = [2]

輸出:2.00000

解釋:合併陣列 = [1,2,3] ,中位數 2

示例 2:

輸入:nums1 = [1,2], nums2 = [3,4]

輸出:2.50000

解釋:合併陣列 = [1,2,3,4] ,中位數 (2 + 3) / 2 = 2.5

這個題,首先想到的是,將兩個陣列先合併,然後再找出其中位數。那麼時間複雜度就主要是在兩個陣列的合併上了。下面是我的渣渣暴力求解思想:(陣列索引從0開始)

input int nums1, intnums2, int nums

output int med

1.nums1和nums2的長度不為0,轉至2;nums1的長度為0,轉至3;nums2的長度為0,轉至4;

2.迴圈比較nums1中與nums2中的每乙個元素,將較小的乙個放入nums;當nums1為遍歷完畢時,將nums2中剩與的元素直接放入nums;當nums2遍歷完畢時,將nums1中剩餘的元素直接放入nums;轉至5;

3.nums=nums2;轉至5;

4.nums=nums1;轉至5;

5.判斷nums的長度是否為奇數,如果為奇數,則中位數為nums.length/2;如果為偶數,則中位數為(nums.length/2+nums.length/2-1)/2。

下面就是我的渣渣實現:

/*

*思路:首先將兩個有序數組合為1個陣列。然後找出陣列的中位數。

*如何合併?兩個陣列存在幾種情況:1.兩個陣列都不為null的情況;2.nums1陣列為null的情況

*3.nums2為空的情況;4.兩個陣列都為null的情況。

*對於1:遍歷兩個陣列,比較兩個陣列中元素的大小,將其中元素小的放入新的陣列;當有乙個陣列遍歷完畢時,將

* 另乙個陣列直接加入新的陣列;

*對於2:直接將nums2陣列元素放到新的陣列中;

*對於3:直接將nums1陣列元素放到新的陣列中;

*對於4:返回0;

*如何找出中位數?這個就很簡單啦。

*/public

double

findmediansortedarrays

(int

nums1,

int[

] nums2)

if(iif(jint length=nums.length;

if(length%2==

0)return((

double

)nums[length/2]

+(double

)nums[length/2-

1])/

2;else

return nums[length/2]

;}if(length1==0)

if(length2==0)

return

0.0d

;}

leetcode每日一練 尋找兩個正序陣列的中位數

leetcode每日一練 尋找兩個正序陣列的中位數 給定兩個大小為 m 和 n 的正序 從小到大 陣列 nums1 和 nums2。請你找出這兩個正序陣列的中位數。例 1 nums1 1,2 nums2 3 則中位數是 2.0 示例 2 nums1 1,2,3 nums2 4,5,6 則中位數是 3...

尋找兩個正序陣列的中位數從暴力到優化

給定兩個大小分別為 m 和 n 的正序 從小到大 陣列 nums1 和 nums2。請你找出並返回這兩個正序陣列的 中位數 示例 1 輸入 nums1 1,3 nums2 2 輸出 2.00000 解釋 合併陣列 1,2,3 中位數 2 示例 2 輸入 nums1 1,2 nums2 3,4 輸出 ...

兩個input 每天一道演算法題 求兩個陣列的交集

求兩個陣列的交集 input nums1 4,9,5 nums2 9,4,9,8,4 output 9,4 note each element in the result must be unique.結果中元素必須唯一 the result can be in any order.元素順序隨意 如...