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))来打印数组的内容。

其次,你在寻找左边界和右边界的逻辑中存在错误。你将找到目标值时将rightleft减1,这是不正确的。应该将rightleft赋值为middle-1middle+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;
    }
}

请使用修正后的代码,并检查输出结果。

Java二分查找:查找目标值在有序数组中的开始和结束位置

原文地址: https://www.cveoy.top/t/topic/cuxS 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录