在具有重复项的排序数组中查找A [i] = i

布加布

考虑到与整数有序数组可能重复,你如何找到一个索引i,使得A[i]=i

这是我读过的一本编程书籍中的一个问题(破解代码面试)。解决方案概述如下:

 public static int magicFast(int[] array, int start, int end) {

    if (end < start || start < 0 || end >= array.length) {
     return -1;
     }

     int midlndex = (start + end) / 2;
     int midValue = array[midlndex];
     if (midValue == midlndex) {
       return midlndex;
     }

     /* Search left */
     int leftlndex = Math.min(midlndex - 1, midValue);
     int left = magicFast(array, start, leftlndex);
     if (left >= 0) {
     return left;
     }

     /* Search right */
     int rightlndex = Math.max(midlndex + i, midValue);
     int right = magicFast(array, rightlndex, end);
     return right;    
}

作者没有评论时间的复杂性。但是,这似乎是O(n)解决方案,因为我们需要查看“中间”点的两侧,这与数组元素不同的问题不同。递归关系为T(n)= 2T(n / 2)+ c(c-用于检查中间元素是否为答案的恒定时间)

那么,这比简单的线性扫描更好吗?为了实现线性时间效率,这似乎过于复杂。我在这里想念什么吗?

大卫·艾森斯塔

不,您什么都不丢失。第一个分支存在短路,但最坏的情况是将同时执行两个调用,从而导致线性时间重复发生。

实际上,通过简单的单元探针下界,此问题没有亚线性时间算法。考虑阵列家族a,其中

a(i) = i + 1 for i ≠ j
a(j) = j

对于一些j这些阵列只能通过检查特定点(即固定点)来区分,这意味着n - 1探针的下限

我假设的原始CTCI问题不允许重复-则修改后的数组a(i) - i不减少,这允许对零元素进行二进制搜索。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

给出具有不同值的预排序数组,找到i使得A [i] = i

使用分而治之检查排序数组是否具有A [i] = i

面试问题-在排序数组X中搜索索引i,使得X [i] = i

检查排序数组A中是否存在A [i] = 2A [j]

在C中,{a [i] = a [++ i]}等于{a [i] = a [i + 1]; i ++;}?

g ++中的目标文件是否具有-I(大写I)的等效项?

Java vs C中的++ i + ++ i + ++ i

i的值(i == -i && i!= 0)在Java中返回true

i = i ++中的操作顺序;

在Go中按v [i] / w [i]对i进行排序的数组

从排序数组中删除重复项,具有不同代码方式的相同解决方案具有不同的输出

用J动词“ I”替换数组中的项。

用 NumPy 数组中的 ```[i,i,i]``` 快速替换元素 i 的 Pythonic 方法?

找出数组中 (i,j) 对的总数,使得 i<j 且 a[i]+a[j]=i+j。

i ++和++ i有什么区别?

在C ++中,最好i> -1或i> = 0

%i或%I在红宝石中做什么?

.I 在 dt[.I,] 中的意外行为

关于C ++中的i ++和++ i

对具有重复项的排序数组使用二进制搜索

Java-a [i] = a [i-1]中的数组访问次数;

$-中的i-flag

在for循环之后,没有{}大括号用于(i = 0; s [i]> ='0'&& s [i] <='9'; ++ i)

C / C ++中的未定义行为:i ++ + ++ i与++ i + i ++

为什么是2 *(I * I)快于2 * I * I在Java中?

在C和C ++中arr [i] = i ++和i = i + 1语句的行为

可以将 for i in range loop on i, i+1 重写为 Python 中的 for i in loop 吗?

如何使用for循环在python中实现“ for (int i=0; i<str.size; i= i*5) ”?

对列表中的i重复-n次