package suanfa.array;

/**

  • 二分查找
    请实现有重复数字的升序数组的二分查找
    给定一个 元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的第一个出现的target,如果目标值存在返回下标,否则返回 -1

  • /
    public class BinarySearch {

    public static void main(String[] args) {

      int[] nums = new int[]{1, 2, 2, 3, 4};
    
      System.out.println(search(nums, 2));

    }

    public static int search(int[] nums, int target) {

      int left = 0;
      int right = nums.length - 1;
    
      while (left <= right) {
    
          int middle = (left + right) / 2;
    
          if (nums[middle] > target) {
              right = middle - 1;
    
          }
    
          if (nums[middle] < target) {
              left = middle + 1;
          }
          //如果 middle的对应的值和目标值相等,则在 left和middle之间找下标最小的
          if (nums[middle] == target) {
              while (middle != 0 && (nums[middle - 1] == nums[middle])) {
                  middle--;
              }
              return middle;
          }
      }
    
      return -1;

    }
    }