Decode Algorithms & LeetCode
  • Decode Algorithms & LeetCode
  • G家练习
  • Array
    • Two Sum
    • Two Pointers
    • PrefixSum
    • Matrix
    • Interval & Sweepline
    • Sort
    • Iterator
    • Segment Tree
  • Binary Search
    • 教学
    • Binary Search on Matrix
    • Binary Search To Find An Answer
  • String
    • Parenthesis
    • Sliding Window
    • Trie
  • LinkedList
  • Tree
    • Level Order Traversal
    • BST or Inorder
    • Construst Tree
  • Stack
  • Heap
  • Greedy
  • BFS
  • DFS
    • DFS on String
    • Backtracking
    • DFS+Memo
  • Graph
    • Union Find
    • Topological Sort
    • Dijkstra
    • Bipartite Graph
  • Dynamic Programing
    • DP on String
    • Knapsack Problem
  • Design
    • Concurrency
  • Math
  • Bit Manipulation
Powered by GitBook
On this page

Was this helpful?

  1. Binary Search

教学

PreviousBinary SearchNextBinary Search on Matrix

Last updated 3 years ago

Was this helpful?

左闭右闭

JDK里的数组二分查找就是用的这种,循环终止条件是 left>right

//JDK里的代码 private static int binarySearch0(int[] a, int fromIndex, int toIndex, int key) { int low = fromIndex; int high = toIndex - 1;//因为是闭区间,而toIndex是不在区间内的,所以需要-1

    while (low <= high) {
        int mid = (low + high) >>> 1;
        int midVal = a[mid];

        //这里的low和high分别在mid上进行加一和减一操作,也与左闭右闭保持了一致性
        if (midVal < key)
            low = mid + 1;
        else if (midVal > key)
            high = mid - 1;
        else
            return mid; // key found
    }
    //这里针对 low==0 而无法判断是否找到的情况
    return -(low + 1);  // key not found.
}

左开右闭

while (L < R) {
    int mid = L + (R - L) / 2;
    if (nums[mid] == target) {
        return mid
    } else if (nums[mid] < target) {
        L = mid + 1
    } else if (nums[mid] > target) {
        R = mid
    }
}
return L/R; 

左闭右开

while (L < R) {
    int mid = L + (R - L + 1) / 2;
    if (nums[mid] == target) {
        return mid
    } else if (nums[mid] < target) {
        L = mid
    } else if (nums[mid] > target) {
        R = mid - 1
    }
}
return L/R; 

左开右开

while (L + 1 < R) {
    int mid = L + (R - L) / 2;
    if (nums[mid] == target) {
        return mid
    } else if (nums[mid] < target) {
        L = mid
    } else if (nums[mid] > target) {
        R = mid
    }
}
if (nums[L] == target) {
    return L;
}
if (nums[R] == target) {
    return R;
}
return -1; // L
https://leetcode-cn.com/problems/binary-search/solution/li-qing-er-fen-cha-zhao-by-hello1100101/
https://blog.csdn.net/m0_37302219/article/details/107180126blog.csdn.net