参考网址:https://blog.csdn.net/Handoking/article/details/82627613?tdsourcetag=s_pctim_aiomsg
题目描述:
给定n个有序整数的集合,求它们的并集。请尽量使用更优时间复杂度的算法。
输入描述:
输入为n-1行,第一行为整数n;接下来n行,每行第一个数m,表示此集合的个数,接下来是m个整数。整数都是从小到大有序排列。其中:
。
输出描述:
输出为一行,经过合并的整数集合。整数从小到大排列。示例1
输入:
4
3 1 2 3
4 1 1 1 3
2 2 3
2 3 4
输出:
1 1 1 1 2 2 3 3 3 3 4
代码如下:
#include <stdio.h>
#include <stdlib.h>
#define max_size 1000
int main()
{
int n, i, j;
int **sets;
int *set_size;
int *result, *result1, sizeResult = 0;
scanf_s("%d", &n);
sets = (int **)malloc(sizeof(int *)* n);
set_size = (int *)malloc(sizeof(int)* n); //存储每个集合大小的数值
for (i = 0; i < n; ++i) {
scanf_s("%d", &set_size[i]);
/*if (set_size[i] > max_size) {
max_size = set_size[i];
}*/
sets[i] = (int *)malloc(sizeof(int)* set_size[i]);
for (j = 0; j < set_size[i]; ++j) {
scanf_s("%d", &sets[i][j]);
}
}
result = (int *)malloc(sizeof(int)* max_size);
result1 = (int *)malloc(sizeof(int)* max_size);
for (int i = 0; i < set_size[0]; i++)
{
result[i] = sets[0][i]; //把第一个集合的元素都赋给result
}
for (int i = 1; i < n; i++)
{
int t = 0;
int ai = 0;
int bi = 0;
int k = 0; int q = 0; //k表示第一个集合的第k个元素,q表示某个集合的第q个元素
while ((k < set_size[0]) && (q < set_size[i]))
{
ai = result[k];
bi = sets[i][q];
if (ai <= bi)
{
result1[t] = ai;
++k;
++t;
}
else
{
result1[t] = bi; ++q; ++t;
}
}
while (k < set_size[0])
{
ai = result[k++];
result1[t] = ai;
t++;
}
while (q <set_size[i])
{
bi = sets[i][q++];
result1[t] = bi;
t++;
}
set_size[0] = t;
for (int j = 0; j < t; j++)
{
result[j] = result1[j];
}
}
for (i = 0; i < set_size[0]; ++i)
{
printf("%d ", result[i]);
}
free(sets);
sets = NULL;
free(set_size);
set_size = NULL;
free(result);
result = NULL;
free(result1);
result1 = NULL;
system("pause");
return 0;
}