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