給定兩個有序數組,如何在O(log(m n))的時間複雜度下求中位數;
如:[1,4][2,3] -> 2.5
[1,6],[5] -> 2
思路分析
如果沒有時間複雜度要求,借助歸并排序的思路,可以在O(m n)的時間複雜度下求解;
大體邏輯如下:
兩個指針分别指向兩個數組的頭部,然後每次移動元素更小的指針,直到移動到中位數的位置;注意邊界的處理,以及奇偶元素的處理即可;
但這個時間複雜度不滿足題目描述要求;
最佳思路分析
這個問題的前提是有序數組,并且涉及到查找元素,所以很容易聯系到二分查找算法;
假如兩個數組分别為a和b,元素個數分别為m和n;從a的中間元素開始處理,判斷這個中間元素在b中的位置,時間複雜度log(n);
如果發現這個位置小于中位數的位置,那麼就再取a中位于中間位置和結束位置中間的元素判斷;
如果大于中位數的位置,那麼就取a中起始位置和中間位置中間的元素,再進行判斷;
如果恰好是中位數的位置,則可以直接處理;
這樣時間複雜度為O(log(m n))
如果元素不在a中,那麼隻需要将a,b互換,重複即可;
總的時間複雜度為2 * O(log(m n)) ,按照時間複雜度計算 即:O(log(m n))
代碼量比較大,需要源碼的關注并回複“第一周算法”即可;
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!