【题解】合并有序表
【题目描述】
k路归并问题
把k个有序表合并成一个有序表。
元素共有n个。
【输入描述】
读入K。接下来K行。每i行第一个数为Ci表示接下来这一行有Ci个数,表示第i个序列。
总数小于100000。
【输出描述】
输出有序序列
【样例输入】
6 3 1 2 3 3 4 5 6 3 7 10 13 3 8 11 14 3 9 12 15 3 0 16 17
【样例输出】
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
【题目分析】
核心方法
把所有数字全部存到一个大数组里(不管顺序)。
直接对整个大数组排序(
sort
)。输出排序后的结果。
为什么可以这样做?
题目已经告诉我们 每个子数组都是有序的,但 合并后的数组不一定有序。
直接 全部存到一个数组里再排序,是最简单的方法(但效率不是最高)。
例子:
3 3 1 5 9 2 2 6 4 3 4 7 8
执行过程
读取输入:
K=3
(3 个子数组)。第1个子数组:
[1, 5, 9]
(长度3
)。第2个子数组:
[2, 6]
(长度2
)。第3个子数组:
[3, 4, 7, 8]
(长度4
)。合并到
result
:result = [1, 5, 9, 2, 6, 3, 4, 7, 8]
(共9
个数字)。排序
result
:std::sort
→[1, 2, 3, 4, 5, 6, 7, 8, 9]
。输出:
1 2 3 4 5 6 7 8 9
。
【参考答案】
#include <iostream> #include <algorithm> using namespace std; int lists[100][100];//存储所有子数组 int sizes[1000]; //每个子数组的长度(大小) int result[1000]; //存放最终合并后的数组 int total_size; //合并后数组总长度 void mergeKSortedLists(int K) { total_size = 0; // 将所有子序列的元素存入 result for (int i = 0; i < K; i++) { for (int j = 0; j < sizes[i]; j++) { result[total_size++] = lists[i][j]; //把 lists[i][j] 的值存入 result,并让 total_size 指向下一个位置。 } } // 直接排序 sort(result, result + total_size); } int main() { int K; cin >> K; // 读取输入 for (int i = 0; i < K; i++) { cin >> sizes[i]; for (int j = 0; j < sizes[i]; j++) { cin >> lists[i][j]; } } //调用函数 mergeKSortedLists(K); // 输出结果 for (int i = 0; i < total_size; i++) { cout << result[i] << " "; } cout << endl; return 0; }
注:很难拿到满分
【思路二】:直接使用优先队列
#include <iostream> #include <queue> using namespace std; int main() { priority_queue<int,vector<int>,greater<int> >q; int n,x,y,i,j; cin>>n; for(i=1;i<=n;i++) { cin>>x; for(j=1;j<=x;j++) { cin>>y; q.push(y); } } while(!q.empty()) { cout<<q.top()<<endl; q.pop(); } return 0; }
扫描二维码推送至手机访问。
版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。