二分法查找目标元素在数组中的索引

发布时间 2023-07-08 10:46:29作者: sgj191024
/**
     * 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,
     * 如果目标值存在返回下标,否则返回 -1。
     * 输入: nums = [-1,0,3,5,9,12], target = 9
     * 输出: 4
     * 解释: 9 出现在 nums 中并且下标为 4
     * 输入: nums = [-1,0,3,5,9,12], target = 2
     * 输出: -1
     * 解释: 2 不存在 nums 中因此返回 -1
     */
    public  int getTarget(int[] arr,int target){
        int left = 0;
        int right = arr.length - 1;

        while (left <= right){
            int middle = (left + right) /2;
            if(target < arr[middle]){
                right = middle - 1;
            }else if(target > arr[middle]){
                left = middle + 1;
            }else {
                return middle;
            }
        }
        return -1;
    }

    @Test
    public void test1(){
        int[] nums = new int[]{-1,0,3,5,9,12};
//        int target = getTarget(nums, 9);
        int target = getTarget(nums, 2);
        System.out.println(target);

    }

  while里面left<=right因为等于时也不会越界

  target < arr[middle]时说明target元素的索引肯定不是middle所以right取middle前一个索引