給定兩個大小為 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 std
::vector;
class solution
else
}// 總數為奇數,找第 total / 2 + 1 個數
if (n == 0)
else
} int totalsize = m + n;
// 總數為奇數,找第 total / 2 + 1 個數
if (totalsize % 2 == 0)
else
}// 尋找a 和 b 陣列中,第k個數字
double findk(const vector& nums1, const vector& nums2, int a_begin, int b_begin, int k)
if (b_begin >= nums2.size())
// k為1時,兩陣列最小的那個為第乙個數
if (k == 1)
return fmin
(nums1[a_begin], nums2[b_begin])
; int mid_a = int16_max;
int mid_b = int16_max;
//mid_a / mid_b 分別表示 a陣列、b陣列中第 k / 2 個數
if (a_begin + k / 2 - 1 < nums1.size()
) mid_a = nums1[a_begin + k / 2 - 1];
if (b_begin + k / 2 - 1 < nums2.size()
) mid_b = nums2[b_begin + k / 2 - 1];
// 如果a陣列的第 k / 2 個數小於b陣列的第 k / 2 個數,表示總的第 k 個數字於 a的第k / 2個數的後半段,或者是b的第 k / 2個數的前半段
// 由於範圍縮小了 k / 2 個數,此時總的第 k 個數實際上等於新的範圍內的第 k - k / 2個數,依次遞迴
if (mid_a < mid_b)
else}}
;
4 尋找兩個有序陣列的中位數
給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0 示例 2 nums1 1,2 ...
4 尋找兩個有序陣列的中位數( )
給定兩個大小為 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 尋找兩個有序陣列的中位數
給定兩個大小為 m 和 n 的有序陣列nums1和nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設nums1和nums2不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0 示例 2 nums1 1,2 nums2 3...