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; } };

 

 

参考资料

  1. https://leetcode.com/problems/binary-search/
  2. https://leetcode.com/problems/find-smallest-letter-greater-than-target/
  3. https://leetcode.com/problems/find-first-and-last-position-of-element-in-sorted-array/
  4. https://leetcode.com/problems/search-in-rotated-sorted-array/

 


__EOF__

本文作者cancantrbl
本文链接https://www.cnblogs.com/cancantrbl/p/13656722.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   cancantrbl  阅读(186)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示