标签:src onclick 表示 数列 ++ tom swa tmp 复杂
输入一个长度为n的整数数列,从小到大输出前m小的数。
第一行包含整数n和m。
第二行包含n个整数,表示整数数列。
共一行,包含m个整数,表示整数数列中前m小的数。
1≤m≤n≤1051≤m≤n≤105,
1≤数列中元素≤1091≤数列中元素≤109
5 3
4 5 1 3 2
1 2 3
##############################################################
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int N = 1e5+10; 5 int arr[N], cnt; 6 int n, m; 7 //O(lgn) 8 void down(int index){ 9 int tmp = index; 10 //在父节点和孩子节点中找到最小的那个节点 11 if(index*2 <= cnt && arr[index*2] < arr[tmp]) tmp = index*2; 12 if(index*2+1 <= cnt && arr[index*2+1] < arr[tmp]) tmp = index*2+1; 13 if(tmp != index){ 14 swap(arr[tmp],arr[index]); 15 down(tmp); 16 } 17 } 18 19 int main(){ 20 cin >> n >> m; 21 cnt = n; 22 for(int i = 1; i<= n;++i)cin >> arr[i]; 23 for(int i = n >> 1;i;--i)down(i);//建堆,从最底层之上的一层开始down,因为最底层的没有意义,此处复杂度O(n) 24 while(m--){ 25 cout << arr[1] << " "; 26 arr[1] = arr[cnt--]; 27 down(1); 28 } 29 return 0; 30 }
end
标签:src onclick 表示 数列 ++ tom swa tmp 复杂
原文地址:https://www.cnblogs.com/sxq-study/p/12228319.html