新闻详情

新闻详情

首页 / 资讯中心 / 详情

【二分查找-1】33.搜索旋转排序数组

发布时间:2026/9/28 4:51:21来源:尧图网络
【二分查找-1】33.搜索旋转排序数组
题目描述整数数组nums按升序排列数组中的值互不相同。在传递给函数之前nums在预先未知的某个下标k0 k nums.length上进行了向左旋转使数组变为[nums[k], nums[k1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]]下标从 0 开始计数。例如[0,1,2,4,5,6,7]下标3上向左旋转后可能变为[4,5,6,7,0,1,2]。给你旋转后的数组nums和一个整数target如果nums中存在这个目标值target则返回它的下标否则返回-1。你必须设计一个时间复杂度为O(log n)的算法解决此问题。示例 1输入nums [4,5,6,7,0,1,2], target 0输出4示例 2输入nums [4,5,6,7,0,1,2], target 3输出-1示例 3输入nums [1], target 0输出-1解题思路方法二分查找核心思路旋转后的数组从中间切开至少有一半是有序的[4, 5, 6, 7, 0, 1, 2] ↑ mid3 左半部分 [4, 5, 6, 7] 有序 右半部分 [0, 1, 2] 有序判断哪一半有序然后看 target 是否在有序的那一半中。算法步骤计算mid如果nums[mid] target返回mid判断左半部分是否有序nums[left] nums[mid]如果左半部分有序如果nums[left] target nums[mid]在左半部分找 →right mid - 1否则在右半部分找 →left mid 1如果右半部分有序如果nums[mid] target nums[right]在右半部分找 →left mid 1否则在左半部分找 →right mid - 1具体过程示例nums [4, 5, 6, 7, 0, 1, 2],target 0初始: left0, right6, mid3 [4, 5, 6, 7, 0, 1, 2] ↑ ↑ ↑ left mid right nums[mid]7 ! 0 nums[left]4 nums[mid]7 → 左半部分有序 target0 不在 [4, 7) 中 → 在右半部分找 left mid1 4 left4, right6, mid5 [4, 5, 6, 7, 0, 1, 2] ↑ ↑ ↑ left mid right nums[mid]1 ! 0 nums[left]0 nums[mid]1 → 左半部分有序 target0 在 [0, 1) 中 → 在左半部分找 right mid-1 4 left4, right4, mid4 nums[mid]0 target → 返回 4 ✅代码实现class Solution { public: int search(vectorint nums, int target) { int left 0, right nums.size() - 1; while (left right) { int mid left (right - left) / 2; if (nums[mid] target) { return mid; } // 判断左半部分是否有序 if (nums[left] nums[mid]) { // 左半部分有序 if (nums[left] target target nums[mid]) { right mid - 1; // target 在左半部分 } else { left mid 1; // target 在右半部分 } } else { // 右半部分有序 if (nums[mid] target target nums[right]) { left mid 1; // target 在右半部分 } else { right mid - 1; // target 在左半部分 } } } return -1; } };复杂度分析维度复杂度说明时间复杂度O(log n)每次排除一半空间复杂度O(1)只用常数个变量关键细节1. 为什么用nums[left] nums[mid]判断左半部分有序如果nums[left] nums[mid]说明左半部分没有旋转点是有序的否则旋转点在左半部分右半部分有序2. 为什么用而不是因为nums[mid]可能等于nums[left]比如left mid时用更安全。3. 边界条件if (nums[left] target target nums[mid])target nums[mid]不是因为nums[mid] target已经在前面判断过了nums[left] target是因为nums[left]可能就是 target4. 和「搜索旋转排序数组 II」的区别题目区别33. 搜索旋转排序数组值互不相同81. 搜索旋转排序数组 II值可能重复81 题需要额外处理nums[left] nums[mid] nums[right]的情况。总结要点说明核心思想二分查找判断哪一半有序关键判断nums[left] nums[mid]判断左半部分有序时间复杂度O(log n)空间复杂度O(1)
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

AI Agent正在重写职业坐标系:从执行者到意图炼金师 2026/9/28 8:41:19

AI Agent正在重写职业坐标系:从执行者到意图炼金师

1. 这不是技术升级,是一场职业结构的物理重置“暴利与绝路、机遇与风险”——这八个字不是修辞,是我在过去18个月里亲眼见证的行业切片。去年五月,我陪一位做了十年外贸单证的老同事做AI Agent落地咨询,他指着屏幕上自动核验信用证…

阅读更多 →
PEMFC燃料电池Matlab建模指南:从电化学到仿真实践 2026/9/28 8:41:19

PEMFC燃料电池Matlab建模指南:从电化学到仿真实践

做新能源仿真这几年,Matlab几乎成了我离不开的工具箱。前阵子有朋友做氢燃料电池系统,说想搭一个质子交换膜燃料电池(PEMFC)模型,但市面上资料要么偏重化学机理、要么就是一大堆看不到关键细节的框图,入门门…

阅读更多 →
深度学习新闻分类与推荐系统实战:TextCNN+PyTorch课程设计解析 2026/9/28 8:41:12

深度学习新闻分类与推荐系统实战:TextCNN+PyTorch课程设计解析

简介:这是用Python实现的基于深度学习的新闻分类推荐系统源码包,面向高校计算机相关专业学生,适用于课程设计、期末大作业或毕业设计等场景,主打“下载即用、无需修改”,适合希望快速交付可运行项目并冲击高分的人群。…

阅读更多 →
AI Agent容错四板斧:校验、暂停、回滚、人工接管 2026/9/28 8:41:12

AI Agent容错四板斧:校验、暂停、回滚、人工接管

做AI Agent最怕的不是它不懂,而是它“不懂装懂”,然后自信地跑完一串命令,把环境搞坏。我去年在带一个自动化运维项目时,Agent负责拉取代码、执行安装脚本、更新配置,结果一天之内连续三次把测试环境弄崩:一…

阅读更多 →
SpringBoot+Vue+MySQL高校物品捐赠管理系统完整设计与实现复盘 2026/9/28 8:41:12

SpringBoot+Vue+MySQL高校物品捐赠管理系统完整设计与实现复盘

毕业设计选了SpringBootVueMySQL做一套高校物品捐赠管理系统,做完之后我最大的感受是:这类系统真正难的点不在技术,而在把"捐赠—审核—认领—交付"的业务链路想清楚,并且每一步都能说出设计理由。这套平台的核心功能包…

阅读更多 →
微分方程通解核心解析:从任意常数C到特解应用 2026/9/28 8:41:12

微分方程通解核心解析:从任意常数C到特解应用

微分方程这门课,最让人挠头的一句话就是“求通解”。我当年学到这里的时候,心里一直犯嘀咕:解就解了,为什么答案非得带个 C?这个 C 到底有什么用?直到后来学完常微分方程、再回头看高数里的这部分内容&…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉