当前位置: 首页 > news >正文

计算机低能儿从0刷leetcode | 33.搜索旋转排列数组

题目:33. 搜索旋转排序数组

思路:看到时间复杂度要求是O(log N)很容易想到二分查找,普通的二分查找我们已经掌握,本题中的数组可以看作由两个分别升序的数组拼成,在完全升序的部分中进行二分查找是容易的,因此我们每次找到mid后,判断mid左侧为完全升序还是右侧为完全升序,比如,若mid左侧为完全升序,此时如果target的范围在这当中(即nums[i]-nums[mid]中),那么就去左边寻找,否则都去右边。

因此,主要思路为以下几部分:

1、判断哪一侧是完全升序的。nums[l]<nums[mid]则左侧完全升序、否则是右侧。

2、若左侧有序且target在这个范围中,就去左边寻找,否则去右边。

3、若右侧有序且target在这个范围中,就去右边寻找,否则去左边。

4、若找不到则返回-1.

代码:

class Solution {
public:int search(vector<int>& nums, int target) {int len=nums.size();int l=0,r=len-1;while(l<=r){int mid = (l+r)/2;if(target==nums[mid]) return mid;if(nums[l]<=nums[mid]){if(target>=nums[l]&&target<nums[mid])  r=mid-1;else l=mid+1;}else if(target>nums[mid]&&target<=nums[r]) l=1+mid;else r=mid-1; }return -1;}
};

补充:

在二分法中,左右指针的移动和循环条件的细微改变都会引起结果的不同。比如循环条件是while(l<r) 还是 while(l<=r),指针移动方式是l=mid,还是l=mid+1。我没有深入研究原理,只是观察并且猜测while(l<=r)与l=mid+1搭配使用是其中一种正确的方式,也许可以死板地记忆以下。

http://www.lryc.cn/news/473263.html

相关文章:

  • SpringBoot+VUE2完成WebSocket聊天(数据入库)
  • 理解 CSS 中的绝对定位与 Flex 布局混用
  • Redis 事务 问题
  • Cpp学习手册-进阶学习
  • 代码随想录-字符串-反转字符串中的单词
  • 勒索软件通过易受攻击的 Cyber​​Panel 实例攻击网络托管服务器
  • Open WebUI + openai API / vllm API ,实战部署教程
  • InsuranceclaimsController
  • 如何成为开源代码库Dify的contributor:解决issue并提交PR
  • SQL进阶技巧:巧用异或运算解决经典换座位问题
  • 【MySQL】 运维篇—数据库监控:使用MySQL内置工具(如SHOW命令、INFORMATION_SCHEMA)进行监控
  • 【温酒笔记】DMA
  • 力扣判断字符是否唯一(位运算)
  • GPU和CPU区别?为什么挖矿、大模型都用GPU?
  • 新兴斗篷cloak技术,你了解吗?
  • 【抽代复习笔记】34-群(二十八):不变子群的几道例题
  • Chrome和Firefox如何保护用户的浏览数据
  • CentOS 7镜像下载
  • opencv-windows-cmake-Mingw-w64,编译opencv源码
  • Puppeteer点击系统:解锁百度流量点击率提升的解决案例
  • Kyber原理解析
  • 2024 CCF CSP-J/S 2024 第二轮认证 真题试卷
  • Android 无障碍服务常见问题梳理
  • Milvus 与 Faiss:选择合适的向量数据库
  • 2024最全CTF入门指南、CTF夺旗赛及刷题网站(建议收藏!)
  • 【论文阅读】ESRGAN+
  • 北京市首发教育领域人工智能应用指南,力推个性化教育新篇章
  • 【Java并发编程】信号量Semaphore详解
  • window11使用wsl2安装Ubuntu22.04
  • 虚拟滚动 - 从基本实现到 Angular CDK