# Binary Search Template ###### tags: `algorithm template` `c++` `Binary Search` ## 1. 左閉右閉區間 - [left, right] ```cpp= int lowerBound(vector<int>& nums, int target) { int left = 0; int right = nums.size() - 1; // 閉區間 [left, right] while (left <= right) { // 區間不為空 int mid = left + (right - left) / 2; if (nums[mid] < target) { left = mid + 1; // [mid + 1, right] } else { right = mid - 1; // [left, mid - 1] } } return left; } ``` ## 2. 左閉右開區間 - [left, right) ```cpp= int lowerBound(vector<int>& nums, int target) { int left = 0; int right = nums.size(); // 閉區間 [left, right) while (left < right) { // 區間不為空 int mid = left + (right - left) / 2; if (nums[mid] < target) { left = mid + 1; // [mid + 1, right) } else { right = mid; // [left, mid) } } return left; // right也可以, 指向同一個位置 } ``` ## 3. 左開右開區間 - (left, right) ```cpp= int lowerBound(vector<int>& nums, int target) { int left = -1; int right = nums.size(); // 閉區間 (left, right) while (left + 1 < right) { // 區間不為空 int mid = left + (right - left) / 2; if (nums[mid] < target) { left = mid; // (mid, right) } else { right = mid; // (left, mid) } } return right; } ``` ## Related Topics ### [34. Find First and Last Position of Element in Sorted Array](https://leetcode.com/problems/find-first-and-last-position-of-element-in-sorted-array) >### Complexity >n = nums.length >| | Time Complexity | Space Complexity | >| ----------- | --------------- | ---------------- | >| | O(logn) | O(1) | ## Note [Ref](https://www.bilibili.com/video/BV1AP41137w7/?spm_id_from=333.788&vd_source=088937f16fb413336c0cb260ed86a1c3) ```text! 三個lowerBound function都是求第一個>= target那個數的idx. 但有時候有時候給你nums及taget並不一定是求>=target的那個數的idx, 也有<, <=, >, 這四種情況是可以互相轉換的: 1. >= -> lowerBound(nums, target) 2. > -> lowerBound(nums, target + 1) 3. <= -> lowerBound(nums, target) - 1 4. < -> lowerBound(nums, target + 1) - 1 ```