4 尋找兩個正序陣列的中位數

2021-10-08 13:12:48 字數 1892 閱讀 6925

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

#include #include #include using namespace std;

class solution

if (index2 == n)

if (k == 1)

//正常情況

int newindex1 = min(index1 + k / 2 - 1, m - 1);

int newindex2 = min(index2 + k / 2 - 1, n - 1);

int pivot1 = nums1[newindex1];

int pivot2 = nums2[newindex2];

//比較 pivot1 = nums1[k/2-1] 和 pivot2 = nums2[k/2-1]

//nums1 中小於等於 pivot1 的元素有 nums1[0 .. k/2-2] 共計 k/2-1 個

//nums2 中小於等於 pivot2 的元素有 nums2[0 .. k/2-2] 共計 k/2-1 個

//取 pivot = min(pivot1, pivot2),兩個陣列中小於等於 pivot 的元素共計不會超過 (k/2-1) + (k/2-1) <= k-2 個

//這樣 pivot 本身最大也只能是第 k-1 小的元素

//如果 pivot = pivot1,那麼 nums1[0 .. k/2-1] 都不可能是第 k 小的元素。把這些元素全部 "刪除",剩下的作為新的 nums1 陣列

//如果 pivot = pivot2,那麼 nums2[0 .. k/2-1] 都不可能是第 k 小的元素。把這些元素全部 "刪除",剩下的作為新的 nums2 陣列

//由於我們 "刪除" 了一些元素(這些元素都比第 k 小的元素要小),因此需要修改 k 的值,減去刪除的數的個數

if (pivot1 <= pivot2)

else

} }double findmediansortedarrays(vector& nums1, vector& nums2)

else

} /*

時間複雜度:o(log(m+n)),其中 m 和 n 分別是陣列nums1 和 nums2 的長度。

初始時有 k=(m+n)/2 或 k=(m+n)/2+1,每一輪迴圈可以將查詢範圍減少一半,

因此時間複雜度是o(log(m+n))。

空間複雜度:o(1)。

*/#else

/* 方法二:劃分陣列

在[0,m] 中找到最大的 i,使得:

a[i−1]≤b[j],其中 j = / 2 - i

*/ double findmediansortedarrays(vector& nums1, vector& nums2)

int m = nums1.size();

int n = nums2.size();

int left = 0, right = m;

//median1:前一部分的最大值

//median2:後一部分的最小值

int median1 = 0, median2 = 0;

while(left<=right)

4 尋找兩個正序陣列的中位數

思路 我現在還沒有進行優化,大概就是合併陣列 參照之前的順序表合併 然後如果合併陣列的大小sum是偶數,返回sum 2和sum 2 1兩個元素除以二,如果sum是奇數則直接返回sum 2的元素 double findmediansortedarrays int nums1,int nums1size...

4 尋找兩個正序陣列的中位數

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

4 尋找兩個正序陣列的中位數

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