Leetcode刷题 - 改进版二分查找
704. 二分查找 - Binary Search
class Solution { public: int search(vector<int>& nums, int target) { int middle, left = 0; int right = nums.size()-1; while (left <= right){ /** 可移动窗口的中位数算法 **/ middle = left + (right - left)/2; if (nums[middle] == target) return middle; if (nums[middle] > target){ right = middle - 1; }else if (nums[middle] < target){ left = middle + 1; } } return -1; } };
744. 查找大于目标的最小字母 - Find Smallest Letter Greater Than Target
class Solution { public: char nextGreatestLetter(vector<char>& letters, char target) { // 很简单的查找 for (char c: letters) if (c > target) return c; return letters[0]; }
也可以强行使用二分法
class Solution { public: char nextGreatestLetter(vector<char>& letters, char target) { int left = 0, right = letters.size() -1; while (left <=right){ int middle = left + (right - left)/2; if (letters[middle] > target) right = middle; else left = middle + 1; // } return letters[left % letters.size()]; //防止超出边界 } };
34. 查找排序数组中元素的第一个位置和最后一个位置 - Find First and Last Position of Element in Sorted Array
class Solution { public: int binarySearch(vector<int>& nums, int target, bool first){ int left = 0, right = nums.size() - 1, result = -1; while (left <= right){ int middle = left + (right - left)/2; if (nums[middle] == target){ result = middle; // 如果是第一次则找左边的index // 若是第二次则找右边的index first == true ? right = middle - 1 : left = middle + 1; } else if (nums[middle] < target) left = middle + 1; else right = middle - 1; } return result; } vector<int> searchRange(vector<int>& nums, int target) { return {binarySearch(nums, target, true), binarySearch(nums, target, false)}; } };
33. 在旋转排序数组中搜索 - Search in Rotated Sorted Array
class Solution { public: int search(vector<int>& nums, int target) { //由于可能会翻转,要随时判断nums在begin, mid, end的大小关系 int begin = 0, end = nums.size() - 1, middle = -1; while (begin <= end){ int middle = (end + begin)/2; if (nums[middle] == target) return middle; if (nums[begin] <= nums[middle]){ if (target <= nums[middle] && target >= nums[begin]) end = middle - 1; else begin = middle + 1; }else{ if (target >= nums[middle] && target <= nums[end]) begin = middle + 1; else end = middle - 1; } } return -1; } };
参考资料
- https://leetcode.com/problems/binary-search/
- https://leetcode.com/problems/find-smallest-letter-greater-than-target/
- https://leetcode.com/problems/find-first-and-last-position-of-element-in-sorted-array/
- https://leetcode.com/problems/search-in-rotated-sorted-array/