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

2021-09-28 07:43:11 字數 1368 閱讀 7638

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