Java二分查找:查找目标值在有序数组中的开始和结束位置
import java.util.Arrays;
public class a04 {
public static void main(String[] args) {
/*给定一个按照升序排列的整数数组 nums,和一个目标值 target。
找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。 */
int []nums = {5,7,7,8,8,10};
int searchleft = searchleft(nums, 5);
int searchright = searchright(nums, 5);
int arr[]={searchleft,searchright};
System.out.println(Arrays.toString(arr));
}
// 寻找左边界
public static int searchleft(int []nums,int target){
int left = 0;
int right = nums.length - 1;
int candidate = -1;
while (right >= left) {
int middle = (right + left) / 2;
if (nums[middle] == target) {
candidate = middle;
right = middle - 1; // 修改此处,继续在左侧寻找
} else if (nums[middle] < target) {
left = middle + 1;
} else if (nums[middle] > target) {
right = middle - 1;
}
}
return candidate;
}
public static int searchright(int []nums,int target){
int left = 0;
int right = nums.length - 1;
int candidate = -1;
while (right >= left) {
int middle = (right + left) / 2;
if (nums[middle] == target) {
candidate = middle;
left = middle + 1; // 修改此处,继续在右侧寻找
} else if (nums[middle] < target) {
left = middle + 1;
} else if (nums[middle] > target) {
right = middle - 1;
}
}
return candidate;
}
}
在你的代码中,寻找左边界和右边界的方法存在一些问题。我将为你指出错误的地方,并提供正确的代码。
首先,你在最后打印结果时使用了System.out.println(arr),这样会输出数组的哈希值,而不是数组的内容。正确的方式应该使用System.out.println(Arrays.toString(arr))来打印数组的内容。
其次,你在寻找左边界和右边界的逻辑中存在错误。你将找到目标值时将right或left减1,这是不正确的。应该将right或left赋值为middle-1或middle+1,以继续在剩余的区间中寻找目标值。
以下是修正后的代码:
import java.util.Arrays;
public class a04 {
public static void main(String[] args) {
int[] nums = {5, 7, 7, 8, 8, 10};
int searchleft = searchleft(nums, 5);
int searchright = searchright(nums, 5);
int[] arr = {searchleft, searchright};
System.out.println(Arrays.toString(arr));
}
// 寻找左边界
public static int searchleft(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
int candidate = -1;
while (right >= left) {
int middle = (right + left) / 2;
if (nums[middle] == target) {
candidate = middle;
right = middle - 1; // 修改此处,继续在左侧寻找
} else if (nums[middle] < target) {
left = middle + 1;
} else if (nums[middle] > target) {
right = middle - 1;
}
}
return candidate;
}
public static int searchright(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
int candidate = -1;
while (right >= left) {
int middle = (right + left) / 2;
if (nums[middle] == target) {
candidate = middle;
left = middle + 1; // 修改此处,继续在右侧寻找
} else if (nums[middle] < target) {
left = middle + 1;
} else if (nums[middle] > target) {
right = middle - 1;
}
}
return candidate;
}
}
请使用修正后的代码,并检查输出结果。
原文地址: https://www.cveoy.top/t/topic/cuxS 著作权归作者所有。请勿转载和采集!