二分查找算法专题
二分模板一共有兩個,分別適用于不同情況。
算法思路:假設目標值在閉區間[l, r]中, 每次將區間長度縮小一半,當l = r時,我們就找到了目標值。
C++ 代碼模板:
// 整數二分算法模板bool check(int x) {/* ... */} // 檢查x是否滿足某種性質// 區間[l, r]被劃分成[l, mid]和[mid + 1, r]時使用: int bsearch_1(int l, int r) {while (l < r){int mid = l + r >> 1;if (check(mid)) r = mid; // check()判斷mid是否滿足當前條件最小值性質else l = mid + 1;}return l; } // 區間[l, r]被劃分成[l, mid - 1]和[mid, r]時使用: int bsearch_2(int l, int r) {while (l < r){int mid = l + r + 1 >> 1;if (check(mid)) l = mid; // check()判斷mid是否滿足當前條件最大值性質else r = mid - 1;}return l; }33. 搜索旋轉排序數組
思路:使用兩段二分
class Solution { public:int search(vector<int>& nums, int target) {if (nums.empty()) return -1;int l = 0, r = nums.size() - 1;while (l < r) {int mid = l + r + 1 >> 1;if (nums[mid] >= nums[0]) l = mid;else r = mid - 1;}if (target >= nums[0]) l = 0;else l = r + 1, r = nums.size() - 1;while (l < r) {int mid = l + r >> 1;if (nums[mid] >= target) r = mid;else l = mid + 1;}if (nums[r] == target) return r;return -1;} };總結
- 上一篇: i5-9600k和i7-8700k区别
- 下一篇: OS X下使用OpenGL做离屏渲染