我把這題推廣到乙個型別:有n個陣列,每個陣列裡面有m個陣列,降序排列,每個數字是32位的unit,求出這m*n個數字中最大的k個。
我們先思考乙個問題有兩個陣列 a1[m],a2[m],我們求這兩個陣列中最大的k個值
那麼我們假設a1中前x1個數屬於最大的k個值,a2中前x2個數輸入最大的k值
那麼x1+x2 = k;如圖
由此我們可以得出x1和x2中肯定有乙個大於等於k/2,怎麼確定呢,我們只需比較a1[k/2]和a2[k/2]誰大那麼就說麼誰大於k/2;那麼我們就直接把他的前k/2取出來。剩下的我們就遞迴取出就ok了,每次我們可以去除剩下的1/n個,(比較k/n時你可能碰到有的陣列被取完了或者不夠k/n自己稍加處理即可)測試程式
#include
using namespace std;
int main()
{int n, m, k, icount;
//有n個陣列,每個陣列裡面有m個陣列,降序排列,每個數字是32位的unit,求出這m*n個數字中最大的k個。
while (cin >> n >> m>> k)
{icount = 0;
while (k >=n)
{cout<
求有序陣列中處於 left,right 區間的部分
該問題可分解為求陣列中第乙個不小於left的下標和求陣列中最後乙個不大於right的下標。include include 求陣列中第乙個不小於left的下標 int firstnotlower const std vector num,const int left low和high相鄰後,分別與le...
百度面試題 從已排序的陣列中求絕對值最小的元素
題目為 有乙個已經排序的陣列 公升序 陣列中可能有正數 負數或0,求陣列中元素的絕對值最小的數,要求,不能用順序比較的方法 複雜度需要小於o n 可以使用任何語言實現 例如,陣列 絕對值最小的是 4。這一題該如何求呢?初步的解決思路是 1.陣列中的元素全為正,取最左邊的數字 2.陣列中的元素全為負,...
百度面試題 把陣列排成最小的數
問題描述 輸入乙個正整數陣列,將它們連線起來排成乙個數,輸出能排出的所有數字中最小的乙個。例如輸入陣列,則輸出這兩個能排成的最小數字32132。請給出解決問題的演算法,並證明該演算法。思路 先將整數陣列轉為字串陣列,然後字串陣列進行排序,最後依次輸出字串陣列即可。這裡注意的是字串的比較函式需要重新定...