二分查找基础 发表于 2022-03-07 | 分类于 算法 , 二分查找 , 二分查找基础 | 本⽂探究了⼏个最常⽤的⼆分查找场景:寻找⼀个数、寻找左侧边界、寻找右侧边界。 寻找⼀个数 这个场景是最简单的,可能也是最熟悉的,即搜索⼀个数,如果存在,返回其索引,否则返回 -1。 12345678910111213141516int BinarySearch(vector<int>& nums, int target) { int left = 0; int right = nums.size() - 1; while(left <= right) { // left + (right-left)/2 为防⽌溢出 int mid = left + (right-left)/2; if(nums[mid] == target) return mid; else if(nums[mid] < target) left = mid + 1; else if(nums[mid] > target) right = mid - 1; } return -1;} 寻找左侧边界1234567891011121314151617181920int left_bound(vector<int>& nums, int target) { int left = 0; int right = nums.size()-1; while(left <= right) { int mid = left + (right-left)/2; if(nums[mid] < target) { left = mid + 1; } else if(nums[mid] > target) { right = mid - 1; } else if(nums[mid] == target) { // 收缩右边界,锁定左边界 right = mid - 1; } } // 最后要检查 left 越界的情况 if(left>=nums.size() || nums[left]!=target){ return -1; } return left;} 寻找右侧边界12345678910111213141516171819int right_bound(vector<int>& nums, int target) { int left = 0; int right = nums.size()-1; while(left <= right) { int mid = left + (right-left)/2; if(nums[mid] < target) { left = mid + 1; } else if(nums[mid] > target) { right = mid - 1; } else if(nums[mid] == target) { // 收缩左边界,锁定右边界 left = mid + 1; } } // 最后要检查 right 越界的情况 if(right<0 || nums[right]!=target) return -1; return right;} -------------本文结束 感谢阅读------------- 本文作者: HReina 本文链接: http://hreina.com/2022/03/07/%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE%E5%9F%BA%E7%A1%80/ 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!