在二进制搜索中首次出现

时间:2016-12-11 08:26:16

标签: java

我正在尝试第一次出现数字5。在这种情况下,答案应为2,但我在这里得到3。

public static void main(String[] args) {
            int A[] = {1, 3, 5, 5, 5, 17, 20};
            int index = BinarySearch(A, 5);
            System.out.println(index);
        }

        public static int BinarySearch(int[] A, int x) {
            int low = 0;
            int high = A.length - 1;

            while (low <= high) {
                //(low + high) / 2
                int mid = low + (high-low)/2; // more optimal -> low + (high-low)/2 (avoid integer overflow)
                if (x == A[mid]) {
                    return mid;
                } else if (x < A[mid]) {
                    high = mid - 1;
                } else {
                    low = mid + 1;
                }
            }
            return -1;
        }

1 个答案:

答案 0 :(得分:1)

当您找到要查找的值时,立即返回mid索引,而不检查是否有较小的索引具有相同的值。

你必须继续搜索:

    public static int BinarySearch(int[] A, int x) {
      int low = 0;
      int high = A.length - 1;
      int mid = -1;
      while (low <= high) {
        mid = low + (high-low)/2;
        if (x <= A[mid]) { // this ensures you keep searching for the first index having
                           // the number you are looking for
                           //
                           // changing x <= A[mid] to x < A[mid] will give you the
                           // last index having the number you are looking for instead
          high = mid - 1;
        } else {
          low = mid + 1;
        }
      }
      if (mid >= 0 && x == A[mid]) {
        return mid;
      }
      return -1;
    }
相关问题