news 2026/4/18 19:25:36

LeetCode 33. Search in Rotated Sorted Array 题解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LeetCode 33. Search in Rotated Sorted Array 题解

LeetCode 33. Search in Rotated Sorted Array 题解

题目描述

整数数组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

示例 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. 初始化左指针left为 0,右指针right为数组长度减 1。
    2. left <= right时,计算中间位置mid
    3. 如果nums[mid] == target,返回mid
    4. 确定mid所在的是左半部分还是右半部分:
      • 如果nums[left] <= nums[mid],说明mid在左半部分:
        • 如果nums[left] <= target < nums[mid],将right设为mid - 1
        • 否则,将left设为mid + 1
      • 否则,说明mid在右半部分:
        • 如果nums[mid] < target <= nums[right],将left设为mid + 1
        • 否则,将right设为mid - 1
    5. 如果循环结束仍未找到目标值,返回-1

复杂度分析

  • 时间复杂度:O(log n),其中 n 是数组的长度。每次查找都会将查找区间减半。
  • 空间复杂度:O(1),只需要常数级的额外空间。

代码实现

方法:二分查找

class Solution: def search(self, nums: List[int], target: int) -> int: # 初始化左指针和右指针 left = 0 right = len(nums) - 1 # 当左指针小于等于右指针时,继续查找 while left <= right: # 计算中间位置 mid = left + (right - left) // 2 # 如果找到目标值,返回下标 if nums[mid] == target: return mid # 确定 mid 所在的是左半部分还是右半部分 if nums[left] <= nums[mid]: # mid 在左半部分 if nums[left] <= target < nums[mid]: # 目标值在左半部分,将右指针移到中间位置的左边 right = mid - 1 else: # 目标值在右半部分,将左指针移到中间位置的右边 left = mid + 1 else: # mid 在右半部分 if nums[mid] < target <= nums[right]: # 目标值在右半部分,将左指针移到中间位置的右边 left = mid + 1 else: # 目标值在左半部分,将右指针移到中间位置的左边 right = mid - 1 # 如果没有找到目标值,返回 -1 return -1

测试用例

测试用例 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

总结

本题是二分查找的经典变体问题,主要考察对二分查找算法的理解和应用。通过确定中间位置所在的部分,我们可以调整查找区间,从而快速定位目标值。

二分查找的核心思想是:使用两个指针分别指向查找区间的两端,计算中间位置,比较中间元素与目标值的大小,根据比较结果缩小查找区间,直到找到目标值或确定目标值不存在。

这种方法的时间复杂度为 O(log n),适用于大规模旋转排序数组的查找。掌握二分查找的原理,对于理解搜索算法和算法设计思想非常重要。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 19:20:49

UnityLive2DExtractor完整指南:5分钟掌握Live2D资源提取终极技巧

UnityLive2DExtractor完整指南&#xff1a;5分钟掌握Live2D资源提取终极技巧 【免费下载链接】UnityLive2DExtractor Unity Live2D Cubism 3 Extractor 项目地址: https://gitcode.com/gh_mirrors/un/UnityLive2DExtractor 想要从Unity AssetBundle中快速提取Live2D Cub…

作者头像 李华
网站建设 2026/4/18 19:12:37

为什么你的Copilot总生成“看似正确实则崩溃”的代码?——解码Token-Level Control Flow校验缺失的致命漏洞

第一章&#xff1a;智能代码生成原理与架构解析 2026奇点智能技术大会(https://ml-summit.org) 智能代码生成并非简单地拼接模板或检索片段&#xff0c;而是基于大规模代码语料训练的深度语言模型对编程语义、上下文约束与软件工程范式进行联合建模的结果。其核心能力源于对AS…

作者头像 李华
网站建设 2026/4/18 19:12:30

抖音下载器终极指南:5分钟掌握批量下载抖音视频的完整方案

抖音下载器终极指南&#xff1a;5分钟掌握批量下载抖音视频的完整方案 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback s…

作者头像 李华
网站建设 2026/4/18 19:11:53

WechatDecrypt:3步解锁你的加密微信聊天记录

WechatDecrypt&#xff1a;3步解锁你的加密微信聊天记录 【免费下载链接】WechatDecrypt 微信消息解密工具 项目地址: https://gitcode.com/gh_mirrors/we/WechatDecrypt 你是否曾因误删重要聊天记录而懊恼&#xff1f;是否想备份珍贵对话却无从下手&#xff1f;微信聊天…

作者头像 李华
网站建设 2026/4/18 19:11:13

从零到一:手把手教你用Ghost打造系统安全网

1. 为什么你需要Ghost系统备份 第一次听说Ghost这个工具时&#xff0c;你可能会有疑问&#xff1a;现在Windows不是自带系统还原功能吗&#xff1f;为什么还要用第三方工具&#xff1f;这里我得说说自己的亲身经历。去年我的主力开发机突然蓝屏&#xff0c;尝试了各种修复方法都…

作者头像 李华