Java 在排序数组中查找索引
一个基本问题是,给定一个排序数组和一个目标值,如果找到了目标,就查找索引。如果不是,则返回按顺序插入的索引。 以下是我的方法:Java 在排序数组中查找索引,java,arrays,binary-search,Java,Arrays,Binary Search,一个基本问题是,给定一个排序数组和一个目标值,如果找到了目标,就查找索引。如果不是,则返回按顺序插入的索引。 以下是我的方法: public int searchInsert1(int[] A, int target) { if (A == null || A.length == 0) return 0; return search(A, target, 0, A.length); } public int search(int[] a, int target,
public int searchInsert1(int[] A, int target) {
if (A == null || A.length == 0)
return 0;
return search(A, target, 0, A.length);
}
public int search(int[] a, int target, int s, int e) {
if (s == e)
return s;
int mid = (s + e) / 2;
if (a[mid] == target) {
return mid;
} else if (target < a[mid]) {
return search(a, target, 0, mid - 1);
} else {
return search(a, target, mid, e);
}
}
有人能详细地帮我吗?提前非常感谢您的代码在以下部分有错误: 1.您将结束索引设置错误,它应该是:A.length-1; 2.条件部分中的返回值错误,其他部分中的返回值应为:searcha、target、0、mid+1、e 正确的代码应为:
public int searchInsert1(int[] A, int target) {
if (A == null || A.length == 0)
return 0;
// check if target is larger than the largest value or smaller than the smallest value
if (target < A[0])
return 0;
else if (target > A[A.length-1])
return A.length-1;
return search(A, target, 0, A.length-1);
}
public int search(int[] a, int target, int s, int e) {
if (s == e)
return s;
int mid = (s + e) / 2;
if (a[mid] == target) {
return mid;
} else if (target < a[mid]) {
return search(a, target, 0, mid - 1);
} else {
return search(a, target, mid+1, e);
}
}
使用这种方法
public int search(int[] a, int target, int s, int e) {
int low = s;
int high = e- 1;
while (low <= high) {
int mid = (low + high) >>> 1;
int midVal = a[mid];
if (midVal < target)
low = mid + 1;
else if (midVal > target)
high = mid - 1;
else
return mid; // key found
}
return -(low + 1); // key not found.
}
这是我用Java编写的最简单的解决方案
*…如果找到目标,则查找索引。如果不是,则返回按顺序插入的索引位置。。。那你怎么知道它是否被发现了?你真正的问题是什么?显然,你有工作代码。如果您想知道为什么它工作而另一个不工作,那么您肯定可以从调试器中找到答案?这就是问题所在吗?看起来很明显-在第一个版本中,如果目标值小于中间值,则搜索数组的上半部分。显然,如果target小于中间值,并且数组按升序排序,则需要搜索数组的下半部分。是否熟悉Arrays.binarySearch方法?首先,可以使用0和length作为参数调用该方法。所以e参数是上限,不包括在内。但是当target
public int search(int[] a, int target, int s, int e) {
int low = s;
int high = e- 1;
while (low <= high) {
int mid = (low + high) >>> 1;
int midVal = a[mid];
if (midVal < target)
low = mid + 1;
else if (midVal > target)
high = mid - 1;
else
return mid; // key found
}
return -(low + 1); // key not found.
}
public static int search(int[] a, int target) {
for (int i = 0; i < a.length; i++) {
if (a[i] == target) {
return i;
}
}
return -1;
}