列印n個陣列整體最大的top k
有n個長度不一的陣列,所有的陣列都是有序的,請從大到小列印這n個陣列整體最大的前k個數。
例如,輸入含有n行元素的二維陣列可以代表n個一維陣列。
219, 405, 538, 845, 971
148, 558
52, 99, 348, 691
再輸入整數k=5,則列印:
top 5: 971, 845, 691, 558, 538
[要求]
時間複雜度為o(k
logk)
o(k \log k)
o(klogk)
,空間複雜度為o(k
logk)
o(k \log k)
o(klogk)
輸入描述:
第一行兩個整數t, k。分別表示陣列個數,需要列印前k大的元素
接下來t行,每行輸入格式如下:
開頭乙個整數n,表示該陣列的大小,接下來n個已排好序的數表示陣列內的數
輸出描述:
從大到小輸出輸出k個整數,表示前k大。
示例1輸入
3 5
5 219 405 538 845 971
2 148 558
4 52 99 348 691
輸出971 845 691 558 538
備註:
1
⩽陣列內數的總個數⩽1
05
1 \leqslant \text \leqslant 10^5
1⩽陣列內數的總個數⩽1
050
⩽陣列內元素⩽1
09
0 \leqslant \text \leqslant 10^9
0⩽陣列內元素⩽1
09保證各個輸入值合法
題解:利用堆來解決。具體思路如下:
ps:優先佇列可以直接使用,省很多事。。。但是鍛鍊編碼能力的話,老老實實寫堆吧23333。
**:
#include
#include
using
namespace std;
vectorint>
> a;
vector<
int> key, val;
int n, m, k, sze;
void
down
(int u )
}void
solve()
sze = n;
for(
int i = n >>
1; i;
--i )
down
( i )
;while
( k--
)else
down(1
);}}
intmain
(void)}
solve()
;return0;
}
列印N個陣列整體最大的Top K
問題描述 n個陣列用二維陣列表示 vector data 將所有數按照從大到小的順序進行排序,輸出前k個數,但這樣在面對海量資料時時間複雜度較高,利用堆的思想進行求解,步驟 1 建堆,將每個陣列的最後乙個數加入堆中,建立乙個大小為n的大堆 2 此時堆頂元素為所有資料中的最大的資料,輸出 3 假設堆頂...
列印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個陣列整體最大的TopK
題目 有n個長度不一的陣列,所有的陣列都是有序的,請從大到小列印這個n個陣列整體最大的前k個數。例如,輸入含有n行元素的二維陣列可以代表n個一維陣列。219,405,538,845,971 148,558 52,99,348,691 再輸入整數k 5,則列印 971,845,691,558,538 ...