/*
 * @lc app=leetcode.cn id=704 lang=javascript
 *
 * [704] 二分查找
 */

// @lc code=start
/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var search = function (nums, target) {
  // 1. 左闭右闭
  // const len = nums.length;
  // let left = 0;
  // let right = len - 1;

  // while (left <= right) {
  //   // 二分查找需要每次更新左右边界
  //   let mid = (right + left) >> 1
  //   const midVal = nums[mid]
  //   if (target === midVal) return mid

  //   // 如果中间数大于目标值,要把中间数排除查找范围,所以右边界更新为mid-1,左边界更新为 mid+1;
  //   // 如果右边界更新为mid,那中间数还在下次查找范围内
  //   if (target > midVal) {
  //     left = mid + 1;
  //   } else {
  //     right = mid - 1;
  //   }
  // }
  // return -1;

  // 2. 左闭右开
  let left = 0;
  let right = nums.length; // 右开
  while (left < right) {
    const midIdx = left + Math.floor((right - left) / 2);
    const mid = nums[midIdx];
    if (mid === target) {
      return midIdx;
    }
    if (mid > target) {
      right = midIdx;
    } else {
      left = midIdx + 1;
    }
  }
  return -1;
};
// @lc code=end

console.log(search([-1, 0, 3, 5, 9, 12], 9))
console.log(search([-1, 0, 3, 5, 9, 12], 2))