704 二分查找

184 阅读1分钟

704 二分查找

Leetcode

题目就是给定一个升序不重复的数组, 找出给定的tag所在的索引值, 使用二分查找

  • 二分查找算法的实现过程比较简单:
    • 设定左右指针
    • 找出中间位置,并判断该位置值是否等于 target
    • nums[mid] == target 则返回该位置下标
    • nums[mid] > target 则右侧指针移到中间
    • nums[mid] < target 则左侧指针移到中间
  • 一般有两种写法, 这个和右指针的设置相关
    • 区间为:[left, right]时, 即left== right时其“搜索区间” 仍然是存在的, 所以循环条件应该是left <= right, 而对应条件的改变应该是: right = mid - 1, left = mid + 1
    • 区间为: [left, right)时, 代码如下
  • 另一个细节时mid的计算, 为了防止所需要查找的数据过大, 即left + right溢出, 一般使用left + ((right - left) / 2)来代替(left + right) / 2,
    • 同样为了进一步优化计算性能, 可以将“除2”的操作转换为右移一位(计算机计算移位运算比除法运算快许多), 即: left + ((right - left) >> 1)
class Solution {
public:
    int search(vector<int>& nums, int target) {
      int left = 0;
      int right = nums.size();
      
      while (left < right)
      {
        int middle = left + ((right - left) >> 1);
        if(nums[middle] > target){
          right = middle;
        }else if(nums[middle] < target){
          left = middle + 1;
        }else{
          return middle;
        }
      }

      return -1;

    }
};