問題描述:
n個陣列用二維陣列表示 vector> data
將所有數按照從大到小的順序進行排序,輸出前k個數,但這樣在面對海量資料時時間複雜度較高,利用堆的思想進行求解,
步驟:1、建堆,將每個陣列的最後乙個數加入堆中,建立乙個大小為n的大堆;
2、此時堆頂元素為所有資料中的最大的資料,輸出;
3、假設堆頂元素在二維陣列中的座標為(i,j),如果j>0,則將data[i][j-1],加入堆頂,並調整堆;
4、每次列印堆頂元素,並迴圈列印k次,
5,在第三步中若j==0,即該堆頂元素是其所在陣列中的第乙個元素,則將堆頂元素和堆的最後乙個元素進行交換,同時堆的大小減一,說明其中乙個陣列遍歷完了,接下來只需要n-1 大小的堆就行了。
這題主要是建立堆,堆的節點儲存的值分別有,當前值大小,當前值在二維陣列中的位置,即第幾個陣列的第幾個數,用於上面的第三步。
#include #include#include#includeusing namespace std;
bool cmp(int a,int b)
//堆的節點的結構
struct heapnode;
void heapinsert(vector&heap,int index);
void heapvify(vector&heap,int index,int heapsize);
void swap(vector&heap,int index1,int index2)
//輸出topk個數
void printtopk(vector> data,int k)
if(rightheap[largest].val)
if(largest!=index)else
index=largest;
left=2*index+1;
right=2*index+1;
}}//在index處插入乙個元素
void heapinsert(vector&heap,int index)
printtopk(test,k);
return 0;
}
列印N個陣列整體最大的TopK
題目 有n個長度不一的陣列,所有的陣列都是有序的,請從大到小列印這個n個陣列整體最大的前k個數。例如,輸入含有n行元素的二維陣列可以代表n個一維陣列。219,405,538,845,971 148,558 52,99,348,691 再輸入整數k 5,則列印 971,845,691,558,538 ...
列印N個陣列整體最大的Top K
列印n個陣列整體最大的top k 有n個長度不一的陣列,所有的陣列都是有序的,請從大到小列印這n個陣列整體最大的前k個數。例如,輸入含有n行元素的二維陣列可以代表n個一維陣列。219,405,538,845,971 148,558 52,99,348,691 再輸入整數k 5,則列印 top 5 9...
陣列與矩陣 列印N個陣列整體最大的TopK
題目 有n個長度不一的陣列,所有的陣列都是有序的,請從大到小列印這個n個陣列整體最大的前k個數。例如,輸入含有n行元素的二維陣列可以代表n個一維陣列。219,405,538,845,971 148,558 52,99,348,691 再輸入整數k 5,則列印 971,845,691,558,538 ...