Leetcode4 兩個排序陣列的中位數

2021-08-28 08:21:07 字數 1263 閱讀 1226

給定兩個大小為 m 和 n 的有序陣列nums1nums2

請找出這兩個有序陣列的中位數。要求演算法的時間複雜度為 o(log (m+n)) 。

你可以假設nums1nums2不同時為空。

示例 1:

nums1 = [1, 3]

nums2 = [2]

中位數是 2.0

示例 2:

nums1 = [1, 2]

nums2 = [3, 4]

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

分析:一眼看去以為題目不難,但是發現要求的時間複雜度為o(log (m+n)),瞬間覺得難度為hard也是正常的了。既然是o(log(m+n))的複雜度,又是找數字的問題,想必大家第一反應都想到用二分法做(大神可能還想到更高階的做法),只是對兩個陣列用二分法大大增加的難度。

我們知道,假設乙個陣列a的長度為len,查詢中位數的話有兩種情況,1:len為偶數,則中位數的值為(第len/2位置的值+第len/2+1位置的值)/2。2:len為奇數,則中位數的值為len/2+1位置上的值

對兩個陣列進行二分法,先把長度小的那個陣列放在前面,如果nums1的長度比nums2長,則交換兩個陣列的位置。現在假設我們求的時兩個合併有序陣列的第k位數字,則我們可以在第乙個陣列裡先取到第k/2位數字,如果k/2個數字比第乙個陣列的長度還要長則把第乙個陣列的數字全都取,設取到的長度為p1,然後再第二個陣列裡取k-p1個數字,記取得的長度為p2.

此時可以分為兩種情況

1:nums1[p1-1]

2:nums1[p1-1]>nums2[p2-1],證明nums1取多了,第k個數字在nums1[p1-1]之前且再nums2[p2-1]之後。

除了以上正常用二分來解題,還有兩個特殊的點需要注意,1:當nums1為空時,直接返回nums2[k-1]即可。2:當k==1時,直接返回nums1[0]和nums2[0]最小的那個。

有了這樣的思路不難寫出**

class solution 

double helper(vector& nums1,vector& nums2,int k)

else

}};

leetcode 4 兩個排序陣列的中位數

給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2 請找出這兩個有序陣列的中位數。要求演算法的時間複雜度為 o log m n 示例 1 nums1 1,3 nums2 2 中位數是 2.0 示例 2 nums1 1,2 nums2 3,4 中位數是 2 3 2 2.5 思路 兩個陣...

LeetCode 4 兩個排序陣列的中位數

給定兩個大小為 m 和 n 的有序陣列nums1和nums2。請找出這兩個有序陣列的中位數。要求演算法的時間複雜度為 o log m n nums1 1,3 nums2 2 中位數是 2.0 nums1 1,2 nums2 3,4 中位數是 2 3 2 2.5 本來可以歸併排序,直接求中位數,但是由...

LeetCode4 兩個排序陣列的中位數

給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2 請找出這兩個有序陣列的中位數。要求演算法的時間複雜度為 o log m n 示例 1 nums1 1,3 nums2 2 中位數是 2.0示例 2 nums1 1,2 nums2 3,4 中位數是 2 3 2 2.5 兩個有序陣列,...