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

标签 java c++ arrays algorithm

昨天我在面试中被问到以下问题:

考虑一个 Java 或 C++ 数组,比如 X,它已排序并且其中没有两个元素是相同的。如何最好地找到一个索引,比如 i,使得该索引处的元素也是 i。即 X[i] = i.

作为澄清,她还给了我一个例子:

Array X : -3 -1 0 3 5 7
index   :  0  1 2 3 4 5

Answer is 3 as X[3] = 3.

我能想到的最好的方法是线性搜索。面试后我虽然对这个问题说了很多,但找不到更好的解决方案。我的论点是:具有所需属性的元素可以在数组中的任何位置。所以它也可能在数组的最后,所以我们需要检查每个元素。

我只是想从这里的社区确认我是对的。请告诉我我是对的:)

最佳答案

这可以在 O(logN) 时间和 O(1) 空间内完成,方法是使用稍微修改的 binary search .

考虑一个新数组 Y 使得 Y[i] = X[i] - i

Array X : -3 -1   0  3  5  7
index   :  0  1   2  3  4  5
Array Y : -3 -2  -2  0  1  2

由于X中的元素都是递增顺序的,所以X中的元素 新数组 Y 将按 非递减 顺序排列。所以一个二进制 在 Y 中搜索 0 将给出答案。

但是创建 Y 需要 O(N) 空间和 O(N) 时间。所以而不是 创建新数组,您只需修改二进制搜索,以便 对 Y[i] 的引用被替换为 X[i] - i

算法:

function (array X) 
       low  = 0
       high = (num of elements in X) - 1

       while(low <= high) 
               mid = (low + high) / 2

               // change X[mid] to X[mid] - mid
               if(X[mid] - mid == 0)
                       return mid

               // change here too
               else if(X[mid] - mid < 0)
                       low = mid + 1;

               else
                       high = mid - 1;
       end while

       return -1 // no such index exists...return an invalid index.

end function

Java implementation

C++ implementation

关于java - 面试问题 - 在排序数组 X 中搜索索引 i 使得 X[i] = i,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4172580/

相关文章:

java - 在 ObjectListing 结果中排除前缀 S3 的 Java 客户端

java - Java 中的 PrintWriter 与 FileWriter

c++ - 基本加密程序无法正确读取文件

c++ - 多维数组C++中沿维度的最小值

javascript - 为什么 for 循环不从数组中删除每个奇数(使用 splice 方法)?

java - 回推缓冲区溢出 - 但我的缓冲区还没有满?

java - 哪个哈希码 HashMap 实现用于值检索

c++ - 您如何测量一个音频样本中的低音量?

javascript - 从 JSON 字符串中提取嵌套的 <a> 元素

python - Pandas - 在带有 numpy 数组的 MultiIndexed DataFrame 上执行 mean()