news 2026/5/1 11:16:03

day127—二分查找—搜索旋转排序数组(LeetCode-33)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
day127—二分查找—搜索旋转排序数组(LeetCode-33)

题目描述

整数数组nums按升序排列,数组中的值互不相同

在传递给函数之前,nums在预先未知的某个下标k0 <= k < nums.length)上进行了向左旋转,使数组变为[nums[k], nums[k+1], ..., 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

提示:

  • 1 <= nums.length <= 5000
  • -104 <= nums[i] <= 104
  • nums中的每个值都独一无二
  • 题目数据保证nums在预先未知的某个下标上进行了旋转
  • -104 <= target <= 104

解决方案:

核心逻辑

代码利用旋转数组「被最小值拆分为两个独立升序子数组」的特性,把复杂的旋转数组查找拆解为两步:

  1. 找分割点:通过findMin函数用二分法找到数组最小值的索引(即两个升序子数组的分割点);
  2. 分区间查找:根据target与数组最后一个元素的大小关系,判断target属于左侧还是右侧升序子数组,再通过lower_bound函数在对应有序区间内用二分法查找目标值,最终返回结果。

总结

  1. 核心策略:将旋转数组查找拆解为「找分割点 + 有序区间二分」,把无序问题转化为有序问题解决;
  2. 关键设计:全程使用开区间二分法(循环条件left + 1 < right),简化边界处理,避免越界;
  3. 效率保障:两次二分查找均为O(log n),整体保持对数级时间复杂度,高效且稳定。

函数源码:

class Solution { int findMin(vector<int>& nums) { int left = -1, right = nums.size() - 1; // 开区间 (-1, n-1) while (left + 1 < right) { // 开区间不为空 int mid = left + (right - left) / 2; if (nums[mid] < nums.back()) { right = mid; } else { left = mid; } } return right; } // 有序数组中找 target 的下标 int lower_bound(vector<int>& nums, int left, int right, int target) { while (left + 1 < right) { // 开区间不为空 // 循环不变量: // nums[right] >= target // nums[left] < target int mid = left + (right - left) / 2; if (nums[mid] >= target) { right = mid; // 范围缩小到 (left, mid) } else { left = mid; // 范围缩小到 (mid, right) } } return nums[right] == target ? right : -1; } public: int search(vector<int>& nums, int target) { int i = findMin(nums); if (target > nums.back()) { // target 在第一段 return lower_bound(nums, -1, i, target); // 开区间 (-1, i) } // target 在第二段 return lower_bound(nums, i - 1, nums.size(), target); // 开区间 (i-1, n) } };
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 3:49:46

HY-MT1.5-7B升级版详解|WMT25夺冠模型的翻译优化之道

HY-MT1.5-7B升级版详解&#xff5c;WMT25夺冠模型的翻译优化之道 1. 模型背景与技术演进 在机器翻译领域&#xff0c;大模型正逐步从“通用翻译”向“精准可控翻译”演进。腾讯混元团队继2025年9月开源HY-MT系列后&#xff0c;于年底推出全新升级版本 HY-MT1.5&#xff0c;包…

作者头像 李华
网站建设 2026/5/1 3:49:13

从零部署腾讯混元翻译大模型|HY-MT1.5镜像快速上手指南

从零部署腾讯混元翻译大模型&#xff5c;HY-MT1.5镜像快速上手指南 在多语言交流日益频繁的今天&#xff0c;高质量、低延迟的机器翻译能力已成为智能应用的核心需求。腾讯开源的 HY-MT1.5-1.8B 翻译大模型&#xff0c;凭借其卓越的跨语言理解能力和边缘设备适配性&#xff0c…

作者头像 李华
网站建设 2026/5/1 3:49:58

HY-MT1.5-7B翻译模型深度解析|WMT25冠军升级版,精准解释性翻译

HY-MT1.5-7B翻译模型深度解析&#xff5c;WMT25冠军升级版&#xff0c;精准解释性翻译 1. 引言&#xff1a;从WMT25冠军到解释性翻译的跃迁 在机器翻译领域&#xff0c;准确传达语义已不再是唯一目标&#xff0c;如何在复杂语境下实现可解释、可控制、可格式化的高质量翻译&a…

作者头像 李华
网站建设 2026/5/1 3:49:24

基于 YOLOv8 的多水果智能识别系统工程化实战 [目标检测完整源码]

基于 YOLOv8 的多水果智能识别系统工程化实战 [目标检测完整源码] 引言&#xff1a;为什么“水果识别”值得单独做一个完整系统&#xff1f; 在很多计算机视觉教学或示例项目中&#xff0c;“水果识别”往往被当作一个简单的目标检测 Demo&#xff1a;跑个模型、画个框就结束…

作者头像 李华
网站建设 2026/4/30 7:21:23

分类器效果可视化:3种直观展示方法

分类器效果可视化&#xff1a;3种直观展示方法 引言 作为市场总监&#xff0c;当你拿到技术团队提供的AI分类器报告时&#xff0c;是否经常被那些密密麻麻的数字和术语搞得一头雾水&#xff1f;特别是看到"混淆矩阵"、"F1值"这些专业名词时&#xff0c;是…

作者头像 李华
网站建设 2026/5/1 3:44:36

PaddlePaddle-v3.3视频分析实战:云端GPU按需付费真香

PaddlePaddle-v3.3视频分析实战&#xff1a;云端GPU按需付费真香 引言&#xff1a;当短视频遇上AI自动打标签 每天处理海量短视频内容&#xff0c;手动打标签不仅效率低下&#xff0c;还容易出错。很多短视频团队都遇到过这样的困境&#xff1a;想用AI技术实现自动视频分析&a…

作者头像 李华