前言
一刷代码随想录,今天的内容是 二分查找。
欢迎大家在评论区留言发表自己的看法,如文章有不妥之处,请批评指正。
一、二分查找模板
对于二分查找不熟悉的小伙伴,可以先阅读《代码随想录》中 二分查找 的文章。
-
边界 [left, right] 的二分查找模板
int bSearch(vector<int>& arr, int target) { int left = 0, right = arr.size() - 1; while (left <= right) { // 使用下面代码代替 (left + right) >> 1 防止相加后整型数据溢出 // >> 运算符的优先级比较小,要加括号 int mid = left + ((right - left) >> 1); if (arr[mid] > target) { right = mid - 1; }else if (arr[mid] < target) { left = mid + 1; }else { return mid; } } return -1; }
-
边界 [left, right) 的二分查找模板
int bSearch(vector<int>& arr, int target) { int left = 0, right = arr.size(); while (left < right) { // 第一处不同 int mid = left + ((right - left) >> 1); if (arr[mid] > target) { right = mid; }else if (arr[mid] < target) { left = mid - 1; }else { return mid; } } return -1; }
-
大于等于 target 的最小下标,边界 [left, right] 的二分查找模板
int bSearch(vector<int>&arr, int target) { int n = nums.size(); int minIndex = n; // 以越界作为初始值 int l = 0, r = n - 1; while (l <= r) { int mid = l + ((r - l) >> 1);