問題:
給兩個已經排好序的陣列,乙個長度為 m (m >= 1), 乙個長度為 n (n >= 1),找出這兩個陣列的中位數。時間複雜度要求為 o(m+n), 空間複雜度為 o(1)。
其實這個問題本身來講是不難的,關鍵的關鍵,是對一些邊界條件的處理。
思路:我們首先判斷中位數的位置,如果 m+n 為奇數,那麼中位數的位置是 第 (m+n+1)/2。 如果 m + n 為偶數,那麼我們要找出第 (m+n)/2 和 第(m+n)/2 + 1, 然後求平均。
我們在兩個陣列上都分配乙個「指標」指到起始位(假定a陣列的指標為pa, b陣列的指標為pb),然後根據它們值的大小,指標不斷的向前推進,直到總的被遍歷的數的個數為(m+n+1)/2 (奇數情況)或者為(m+n)/2 (偶數情況)。
我們在移動指針對陣列中的數進行比較的時候,我們要考慮指標是否已經操過陣列的大小,然後才能進行比較,這是乙個非常值得注意的地方。
public float median(int a, int b) pb++; } else if (pb >= b.length) pa++; } else if (a[pa] <= b[pb]) pa++; } else pb++; } } } else pb++; } else if (pb >= b.length) pa++; } else if (a[pa] <= b[pb]) pa++; } else pb++; } } } return median; }
排序 四 歸併排序(合併兩個已經排好序的陣列)
是建立在歸併操作上的一種有效的排序演算法。平均 最好和最壞時間複雜度都為o nlog2n 線性對數。是穩定的。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用,且各層分治遞迴可以同時進行。也叫歸併演算法,指的是將兩個已經排序的序列合併成乙個序列的操作。歸併排序演算法依...
雅虎筆試題 兩個已經排好序的陣列,找中位數
題目 現在有兩個排好序的整數陣列,a n 和b n 要求寫乙個函式,功能為返回兩個陣列中第n大數和第n 1大數的中間值,即求解兩者的和除以2。函式原型 double getmedian int a,int b 下面,我們先來分析乙個類似的問題,假設a和b都是公升序的,分別有n1和n2個元素,求兩個陣...
雅虎筆試題 兩個已經排好序的陣列,找中位數
題目 現在有兩個排好序的整數陣列,a n 和b n 要求寫乙個函式,功能為返回兩個陣列中第n大數和第n 1大數的中間值,即求解兩者的和除以2。函式原型 double getmedian int a,int b 下面,我們先來分析乙個類似的問題,假設a和b都是公升序的,分別有n1和n2個元素,求兩個陣...