这是我编写的用于查找数字的上限和下限的程序。
public class BinarySearchAlgorithm {
public static void main(String[] args) {
int[] arr = {10, 9, 8, 7, 4, 3, 2, 1};
int target = 6;
System.out.println(ceilingOfNumber(arr, target));
System.out.println(floorOfNumber(arr, target));
}
static int ceilingOfNumber(int[] arr, int target) {
int start = 0;
int end = arr.length -1;
boolean isAscending = arr[start] < arr[end];
while (start <= end) {
int mid = start + (end - start) / 2;
if (target == arr[mid]) {
return mid;
}
if (isAscending) {
if (target > arr[mid]) {
start = mid + 1;
} else {
end = mid -1;
}
} else {
if (target > arr[mid]) {
end = mid - 1;
} else {
start = mid + 1;
}
}
}
return start;
}
static int floorOfNumber(int[] arr, int target) {
int start = 0;
int end = arr.length -1;
boolean isAscending = arr[start] < arr[end];
while (start <= end) {
int mid = start + (end - start) / 2;
if (target == arr[mid]) {
return mid;
}
if (isAscending) {
if (target > arr[mid]) {
start = mid + 1;
} else {
end = mid -1;
}
} else {
if (target > arr[mid]) {
end = mid - 1;
} else {
start = mid + 1;
}
}
}
return end;
}
}
我正在尝试获取数字上限和数字下限的索引值。从数组中显然应该是
ceilingOfNumber 应返回:3 FloorOfNumber 应返回:4
但他们却回来了
ceilingOfNumber 应返回:4 FloorOfNumber 应返回:3
我尝试调试它,也进行了代码跟踪,但找不到任何解决方案。
您实现的代码的问题是,您总是返回单元格值的开始索引和下限值的结束索引,即使您同时考虑升序和降序数组。
让我们了解一下这个问题。根据逻辑,如果目标数字不存在于实际数组中,则循环只会在
end < start
时终止。现在,如果它是升序数组,则结束索引的值将小于开始索引的值。因此,下限的结束索引和上限的开始索引没有问题。但是 对于降序数组, end < start
意味着起始索引的值小于结束索引的值。在这种情况下,上限应该是结束索引,下限应该是开始索引。
你可以改变你的逻辑 -
天花板:
return isAscending ? start : end;
return isAscending ? end : start;