这是一个面试问题,我被要求修改代码 - >
给定一个排序数组,我必须找到该元素的数组索引(如果它存在),否则我必须返回-1。以下是我的代码:
public static int returnIndex(int[] a, int x) {
int n = a.length;
if (n == 0) {
return -1;
}
int l = 0;
int r = n - 1;
while (l < r) {
int m = (l + r) / 2;
if (a[m] > x) {
r = m - 1;
} else {
l = m;
}
}
if (a[l] == x) {
return l;
}
return -1;
}
如果我必须找到中间元素但是当我必须找到任何其他元素时失败(进入无限循环),代码工作正常。有谁可以指出错误?
我可以在此代码中仅进行 3次修改。 最坏情况时间复杂度-O(log(n)) 最坏情况Space Complexity-O(1)
答案 0 :(得分:2)
您正在尝试二进制搜索。所以你需要有3个条件。 midValue&gt; key,midValue&lt; key和midValue == key。您只处理2.当midValue&gt;您需要为索引添加一个键。所以修改你的方法,如
public static int returnIndex(int[] a, int x) {
int n = a.length;
if (n == 0) {
return -1;
}
int l = 0;
int r = n - 1;
while (l < r) {
int m = (l + r) / 2;
if (a[m] > x) {
r = m - 1;
} else if(a[m] < x){
l = m + 1;
} else {
return m;
}
}
return -1;
}
如果您没有进行锻炼,可以通过Arrays.binarySearch()
方法实现相同的目标。
答案 1 :(得分:0)
我会这样:
public static int returnIndex(int[] a, int x) {
int n = a.length;
if (n == 0) {
return -1;
}
int l = 0;
int r = n - 1;
while (l < r) {
int m = (l + r) / 2;
if (a[m] == x) {
return m;
}
if (a[m] > x) {
r = m - 1;
} else {
l = m + 1;
}
}
return -1;
}