【问题标题】:c program to find the duplicate element in an ascending array using logn time complexity [duplicate]c程序使用logn时间复杂度在升序数组中查找重复元素[重复]
【发布时间】:2017-05-20 04:18:11
【问题描述】:

数组是升序需要找到重复的数字 需要一个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];
           }

【问题讨论】:

  • 您需要一个程序...好吧,您似乎走在了正确的轨道上。你有东西写。现在,您有问题吗?
  • 1) int size = sizeof[n]; --> int size = sizeof n/ sizeof *n;
  • 通过clang-format 浏览它,让代码看起来很漂亮。这里有一个在线格式化程序:format.krzaq.cc
  • 嘿,谢谢
  • else if (a[mid] != a[mid + 1]) 没有匹配的if (...)

标签: c


【解决方案1】:

如果您假设数字必须从 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;
}

【讨论】:

    猜你喜欢
    • 2017-11-15
    • 2019-07-10
    • 2015-01-15
    • 1970-01-01
    • 2011-06-06
    • 2018-02-21
    • 2015-10-24
    • 2020-01-29
    • 1970-01-01
    相关资源
    最近更新 更多