当前位置: 首页 > 知识库问答 >
问题:

在n个数组中寻找唯一元素

齐思淼
2023-03-14

我试图写一个算法,它需要可变数量的通用数组,存储在d_arrays中,并收集其中所有唯一的元素(元素只发生一次),并将其存储在一个数组中,称为d_results。例如,数组:

int intA[] = { 12, 54, 42 };
int intB[] = { 54, 3, 42, 7 };
int intC[] = { 3, 42, 54, 57, 3 };

将生成包含{12,7,57}内容的数组d_结果

以下是我当前的流程算法:

template <class T>
inline
void UniqueTableau<T>::run() {
    T* uniqueElements = d_arrays[0];
    int count = 0;
    for (int i = 1; i < d_currentNumberOfArrays; ++i) {
        if (count == 0) {
            uniqueElements = getUnique(uniqueElements, d_arrays[i], d_sizes[i - 1], d_sizes[i]);
            ++count;
        }
        else {
            uniqueElements = getUnique(uniqueElements, d_arrays[i], d_numberOfElementsInResult, d_sizes[i]);
        }
    }
    d_results = uniqueElements;
}

template <class T>
inline
T* UniqueTableau<T>::getUnique(T* first, T* second, int sizeOfFirst, int sizeOfSecond) {
    int i = 0;
    int j = 0;
    int k = 0;
    T* uniqueElements = new T[sizeOfFirst + sizeOfSecond];
    while (i < sizeOfFirst) {    // checks the first against the second
        while ((first[i] != second[j]) && (j < sizeOfSecond)) {
            ++j;
        }
        if (j == sizeOfSecond) {
            uniqueElements[k] = first[i];
            ++i;
            ++k;
            j = 0;
        } else {
            ++i;
            j = 0;
        }
    }
    i = 0;
    j = 0;
    while (i < sizeOfSecond) {    // checks the second against the first
        while ((second[i] != first[j]) && (j < sizeOfFirst)) {
            ++j;
        }
        if (j == sizeOfFirst) {
            uniqueElements[k] = second[i];
            ++i;
            ++k;
            j = 0;
        } else {
            ++i;
            j = 0;
        }
    }

    T* a = new T[k];    // properly sized result array
    for (int x = 0; x < k; ++x) {
        a[x] = uniqueElements[x];
    }

    d_numberOfElementsInResult = k;
    return a;
}

请注意,d_size是一个数组,它包含d_数组中每个数组的大小,而d_numberOfElementsInResultd_结果中的元素数。

现在,这个数组所做的是一次比较两个元素,获取这两个元素之间的唯一元素,并将这些元素与下一个数组进行比较,依此类推。问题是,当我这样做时,有时有些元素在第三个数组和前两个数组的唯一元素之间是唯一的,但在第三个数组和第一个数组之间不是唯一的。这是一个令人困惑的词,下面是一个使用上面数组的可视化示例:

首先,该算法找到第一个和第二个数组的唯一元素。

{ 12, 3, 7 }

现在,它将根据第三个数组检查这一点,并在这些数组之间生成唯一的元素。

{ 12, 7, 42, 54, 57 }

正当错误的这里的问题是,由于4254没有出现在唯一的数组中,因此它们最终会出现在最终产品中,即使这三个数组都是通用的。

有人能想出解决这个问题的办法吗?对该算法的修改是首选,但如果不可能,还有什么其他方法来解决这个问题?


共有3个答案

冀嘉木
2023-03-14

解决方案1:

  1. 只需将所有数组的所有元素放在一个数组中
  2. 对数组进行排序
  3. 删除重复项

解决方案二:

  1. 创建一个映射,其中key是元素,value是布尔值

为什么我把值作为布尔值而不是整数:

我们知道,如果映射中存在键形式的元素,则表示该元素存在于数组中。因此,如果我们下次设为false,如果我们再次找到元素,它将显示为replicate。希望你能理解。

郏稳
2023-03-14

记忆是个问题,虽然我会用不同的方式来做这件事(因为缺乏经验?)-事实上,我在想刚刚发布的答案!

无论如何,不要丢弃副本并将其保存在辅助阵列中。将这个数组附加到每个新数组中两次,这样算法就不会有什么变化。唯一的变化是每次创建副本并查看更大的列表。虽然这增加了时间和记忆。如果这是一个问题,那么就用第一个张贴的答案!

长孙绍辉
2023-03-14

编辑:正如所指出的,该算法的时间复杂度为O(nlogn),空间复杂度为O(n)。

遍历所有数组中的每个元素,并形成遍历的每个项的计数的映射。

一旦创建了映射,只需迭代它,并形成计数为1的元素数组。

 类似资料:
  • 问题内容: 在最近的一次采访中有人问我这个问题。 您将获得一个包含一百万个元素的数组。除了一个元素外,所有元素都是重复的。我的任务是找到独特的元素。 我的做法是要经过在整个数组循环,然后创建一个索引作为数组中和的数组中出现的次数。然后再次遍历我们的地图,并返回值为1的索引。 我说我的方法会花费时间。面试官告诉我要以低于复杂度的方式对其进行优化。我说过,我们不能,因为我们必须遍历具有一百万个元素的整

  • 代码不止一次返回0和公共数字。我想让它返回一个数组与公共数字一次!那么,如何返回一个数组,数组中的数字对两个数组都是通用的。我想返回{2,7,4}-类似这样的东西。当我试图返回数组时,我总是出现越界异常。谢谢,巴里

  • 问题内容: 我只需要找到1D中最小的第n个元素。 例如: 我想获得第五个最小的元素,所以我想要的输出是。 我当前的解决方案是这样的: 但是,找到5个最小的元素然后再选择最大的元素对我来说似乎很笨拙。有更好的方法吗?我是否缺少一个可以实现目标的功能? 有些问题的标题与此相似,但我没有看到任何答案。 编辑: 我本来应该提到它,但是性能对我来说很重要。因此,虽然不错的解决方案对我来说不起作用。 结果:

  • 本文向大家介绍在JavaScript中寻找数字数组中的缺失元素,包括了在JavaScript中寻找数字数组中的缺失元素的使用技巧和注意事项,需要的朋友参考一下 我们需要编写一个JavaScript函数,该函数接受一个长度为n的数字数组。该数组包含从0到n的所有整数(包括0和n),但是仅缺少一个整数,它可以是任何数字,并且不对数组进行排序。我们函数的任务是找到丢失的数字,并在线性时间和恒定空间中将其

  • 这是一个算法问题。如果我错过了Python中任何有帮助的现有函数,请大喊一声。 给定一组元素的,我们可以在Python中使用函数来找到所有唯一的k元素子集。让我们调用包含所有这些子集的集合。请注意,每个这样的子集都有不同的元素。 问题是两步走。首先,给定这些k-不同元素子集,我想组合(其中的一些),这样(组合只是一些子集的超集): > 构图中任意两个子集之间的交集为空 构图中所有子集的并集给出的正

  • 本文向大家介绍寻找一数组中前K个最大的数相关面试题,主要包含被问及寻找一数组中前K个最大的数时的应答技巧和注意事项,需要的朋友参考一下 考察点:数组