c 程序使用 logn 时间复杂度查找升序数组中的重复元素

标签 c

数组按升序排列,需要找出重复的数字 需要一个时间复杂度为logn的程序

        int n[] = {1, 2, 3, 4, 5, 5, 6};


        int size = sizeof[n];
        int mid;
            mid = size/ 2 ;
            if (a[mid] == a[mid + 1])
                        printf("%d",a[mid]);
                        return a[mid];

            else if (a[mid] != a[mid + 1])
                        for(int i=0;i<mid;i++){
                                        if(a[i]==a[mid+1])
                                           return a[i];
           }
           else
                        for(int i=mid ;mid<size;i++){
                                        if(a[mid]==a[mid+1])
                                           return a[mid];
           }

最佳答案

如果您假设数字必须从 0 开始并以 1 递增,您可以将中间值与索引进行比较。如果中间相同,则较高,如果中间不同,则较低。

这将为您提供二分搜索时间 O(log2 N)。唯一的区别是您正在与索引进行比较,而不是与固定值进行比较。 示例:int n[] = {0,1, 2, 3, 4, 5, 5, 6}; 注:数字以0开头 如果数字以 1 开头,则相应地更改索引

int findDuplicate(int array[],int n) {
int low = 0;
int high = n - 1;

while (low <= high) {
    int mid = (low + high)/2;
    int midVal = array[mid];

    if (midVal == mid)
        low = mid + 1;
    else
        high = mid - 1;
}
return high;
}

关于c 程序使用 logn 时间复杂度查找升序数组中的重复元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41488134/

相关文章:

c - 如何使用字符串打开二进制文件?使用 C

c++ - 我可以在没有 C++ 的情况下学习 Win32 API(仅使用 C)吗?

C 如何将标量类型转换为非标量类型并向后转换?

将四个整数合并为一个

c - C中的Dbus结构体和方法调用

c - 如何在 C 中以特定速率运行循环(在仿真中)

c - 16bit*32bit MUL 结果为48bit

c - 使用 int 指针简单测试 malloc 和 free 会导致双重释放或损坏错误

c - 快速排序算法给出段错误

c - 无法将 c 代码链接到 lapack/blas : undefined reference