【问题标题】:can someone suggest a better algorithm than this to check if there is at least one duplicate value in an array?有人可以建议一种比这更好的算法来检查数组中是否至少有一个重复值吗?
【发布时间】:2023-01-19 02:13:39
【问题描述】:

一个未排序的整数数组 nums,它的大小 numsSize 作为函数 containsDuplicate 的参数给出,如果至少存在一个重复值,我们必须返回一个布尔值 true,否则返回 false。 对于这个任务,我选择检查每个元素以及之后的元素是否相等,直到到达最后一个第二个元素,如果相等,我将返回 true,否则返回 false。

bool containsDuplicate(int* nums, int numsSize){
    for(int i =0 ;i< numsSize-1;i++)
    {
        for(int j = i+1;j < numsSize; j++)
        {
            if(nums[i] == nums[j])
            {
                return true;
            }
        }
    }
    return false;
}

为了最大限度地减少运行时间,我只在找到重复项时写了返回值,但我的代码在大型数组上仍然表现不佳,我希望算法的时间复杂度 O(n) 如果可能的话。无论如何我们可以跳过与之前查看的值重复的值吗? 我已经看过所有其他解决方案,但找不到更好的解决方案 C.

【问题讨论】:

  • 注意该函数应该声明为 bool containsDuplicate( const int* nums, size_t numsSize);那就是函数不应更改传递的数组。:)

标签: c data-structures


【解决方案1】:

你的算法是 O(n^2)。但如果你先排序,这可以在不到 O(n^2) 的时间内完成,然后确定数组中是否存在重复是 O(n)。

您可以维护一个查找表以确定每个值之前是否已被看到,这将在 O(n) 时间内运行,但除非存储在数组中的潜在值相对较小,否则这会占用大量内存。

例如,如果您知道数组中的值范围为 0-127。

int contains_dupes(int *arr, size_t n) {
   char seen[128] = {0};
   for (size_t i = 0; i < n; i++) {
       if (seen[arr[i]]) return 0;
       seen[arr[i]] = 1;
   }
   return 1;
}

但是如果我们假设 int 是 4 个字节,并且数组中的值可以是任何 int,并且我们使用 char 作为我们的查找表,那么您的查找表必须是4GB在尺寸方面。

【讨论】:

    猜你喜欢
    • 2019-06-01
    • 2023-03-19
    • 1970-01-01
    • 2015-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-06
    • 1970-01-01
    相关资源
    最近更新 更多