百词斩笔试题------数组合并

参考网址:https://blog.csdn.net/Handoking/article/details/82627613?tdsourcetag=s_pctim_aiomsg
题目描述:
给定n个有序整数的集合,求它们的并集。请尽量使用更优时间复杂度的算法。
输入描述:
输入为n-1行,第一行为整数n;接下来n行,每行第一个数m,表示此集合的个数,接下来是m个整数。整数都是从小到大有序排列。其中: 0 < m , n <= 1000
输出描述:
输出为一行,经过合并的整数集合。整数从小到大排列。示例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;
}

猜你喜欢

转载自blog.csdn.net/qq_36427732/article/details/82658411