C语言 如何降低给定代码时间复杂度?

72qzrwbm  于 2022-12-17  发布在  其他
关注(0)|答案(2)|浏览(164)

要检查重复元素并在存在重复元素时返回true,否则返回false的代码。

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

我认为这是正确的代码,但它显示了一个超过时间限制的错误。

46scxncf

46scxncf1#

以降低给定代码的时间复杂度?
时间复杂度O(nn)
时间复杂度O(n
log n)
1.将阵列a复制到新阵列b
1.将bqsort()排序
1.遍历b查找相邻的重复。

0wi1tuuw

0wi1tuuw2#

如果你还记得...
假设int为4字节(这是常见的),你可以使用半个千兆字节的动态内存在O(N)中完成它,它是通过创建一个无符号字符数组,让每一位代表一个int值来完成的。
比如:

#include <stdio.h>
#include <stdlib.h>

int containsDuplicate(int *a, int n)
{
  int res = 0;
  size_t sz = (1ULL << 32) / 8;  // or just (1ULL << (32-3))
  unsigned char* p = calloc(sz, 1);
  if (!p) exit(1);

  for (size_t i = 0; i < n; ++i)
  {
    unsigned int u = a[i];
    unsigned int idx = u / 8;
    unsigned int bit = u % 8;
    unsigned char v = p[idx];

    if (((v >> bit) & 0x1) != 0)
    {
      res = 1;
      break;
    }
    p[idx] |= (1 << bit);
  }
  free(p);
  return res;
}

int main()
{
  int arr[] = {435435, 7657, 43243, 435435, 989723};
  size_t sz_a = sizeof arr / sizeof arr[0];

  if (containsDuplicate(arr, sz_a))
  {
      puts("Duplicate found");
  }
  else
  {
    puts("No duplicate found");
  }

  arr[3] = 42;

  if (containsDuplicate(arr, sz_a))
  {
      puts("Duplicate found");
  }
  else
  {
    puts("No duplicate found");
  }

  return 0;
}

输出:

Duplicate found
No duplicate found

相关问题