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

搜索旋转排序数组

🔍 题目解析

给定一个 旋转排序数组 nums,该数组是一个 递增有序数组 在某个未知的索引处 旋转 形成的。例如:

输入: nums = [4,5,6,7,0,1,2], target = 0
输出: 4

目标:在 O(log n) 时间复杂度 内找到 target 的索引,找不到返回 -1。

📝 详细思路

这道题的本质是 二分查找,但由于数组发生了旋转,我们需要额外判断 mid 位置属于 左半部分 还是 右半部分,从而确定 target 可能在哪一侧。

💡 关键点

1. 常规二分查找

• 计算 mid = left + (right - left) / 2

• nums[mid] == target 时,返回 mid

2. 判断 mid 属于左半部分还是右半部分

• 若 nums[mid] >= nums[0],说明 mid 在左半部分

• 若 nums[mid] < nums[0],说明 mid 在右半部分

3. 基于 target 位置进行调整

mid 在左半部分

• 若 target 在 左半部分 且 target < nums[mid],搜索左侧 right = mid - 1

• 否则,搜索右侧 left = mid + 1

mid 在右半部分

• 若 target 在 右半部分 且 target > nums[mid],搜索右侧 left = mid + 1

• 否则,搜索左侧 right = mid - 1

📌 代码运行步骤

示例 1

输入: nums = [4,5,6,7,0,1,2], target = 0

初始状态

left

right

mid

nums[mid]

target

0

6

3

7

0

1️⃣ 第一次循环

• mid = (0 + 6) / 2 = 3

• nums[mid] = 7

• nums[mid] >= nums[0],mid 在 左半部分

• target = 0 在 右半部分

• left = mid + 1 = 4

left

right

mid

nums[mid]

target

4

6

5

1

0

2️⃣ 第二次循环

• mid = (4 + 6) / 2 = 5

• nums[mid] = 1

• nums[mid] < nums[0],mid 在 右半部分

• target = 0 在 右半部分 且 target < nums[mid]

• right = mid - 1 = 4

left

right

mid

nums[mid]

target

4

4

4

0

0

3️⃣ 第三次循环

• mid = (4 + 4) / 2 = 4

• nums[mid] == target

返回 mid = 4

示例 2

输入: nums = [4,5,6,7,8,1,2,3], target = 8

初始状态

left

right

mid

nums[mid]

target

0

7

3

7

8

1️⃣ 第一次循环

• mid = (0 + 7) / 2 = 3

• nums[mid] = 7

• nums[mid] >= nums[0],mid 在 左半部分

• target = 8 也在 左半部分,且 target > nums[mid]

• left = mid + 1 = 4

left

right

mid

nums[mid]

target

4

7

5

1

8

2️⃣ 第二次循环

• mid = (4 + 7) / 2 = 5

• nums[mid] = 1

• nums[mid] < nums[0],mid 在 右半部分

• target = 8 在 左半部分

• right = mid - 1 = 4

left

right

mid

nums[mid]

target

4

4

4

8

8

3️⃣ 第三次循环

• mid = (4 + 4) / 2 = 4

• nums[mid] == target

返回 mid = 4

🛠 代码优化

class Solution {
public:
    int search(vector<int>& 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;

            // mid 在左半部分
            if (nums[mid] >= nums[0]) {
                if (target >= nums[0] && target < nums[mid]) {
                    right = mid - 1;
                } else {
                    left = mid + 1;
                }
            } 
            // mid 在右半部分
            else {
                if (target < nums[0] && target > nums[mid]) {
                    left = mid + 1;
                } else {
                    right = mid - 1;
                }
            }
        }
        return -1;
    }
};

🎯 复杂度分析

时间复杂度

空间复杂度

O(log n)

O(1)

时间复杂度:二分查找,每次搜索范围缩小一半,故为 O(log n)

空间复杂度:只使用了常数级别变量,故为 O(1)


文章转载自:

http://ccsBQ0AN.mggwr.cn
http://Q6hVYll0.mggwr.cn
http://7oIhQ0QK.mggwr.cn
http://EFCszXZ1.mggwr.cn
http://ZLqbcmca.mggwr.cn
http://Pzq1ojLk.mggwr.cn
http://J3AB8Pmb.mggwr.cn
http://PfEFkYvz.mggwr.cn
http://IB0XKkc9.mggwr.cn
http://qBJZ2Ibu.mggwr.cn
http://GTTTkMeo.mggwr.cn
http://zXe44G0A.mggwr.cn
http://sp6NZ7Oe.mggwr.cn
http://2sCp7loA.mggwr.cn
http://HGndxE22.mggwr.cn
http://f1G0hRyG.mggwr.cn
http://Y2pIbGlx.mggwr.cn
http://iQ8FYO50.mggwr.cn
http://bWB1XlBY.mggwr.cn
http://qVh6wcmK.mggwr.cn
http://dIf1LYC7.mggwr.cn
http://poL8Psl9.mggwr.cn
http://y74lWAmR.mggwr.cn
http://saO9jgxv.mggwr.cn
http://zUQQnfEp.mggwr.cn
http://5e0U2u5S.mggwr.cn
http://XkWSQpwM.mggwr.cn
http://K4YAo2PE.mggwr.cn
http://F2SZCD6P.mggwr.cn
http://X6q93xJf.mggwr.cn
http://www.dtcms.com/a/89726.html

相关文章:

  • 初见MyBatis
  • 区间端点(java)(贪心问题————区间问题)
  • 游戏中的碰撞检测算法
  • 吐血整理:Air8201如何使用LuatOS进行电源管理功能!
  • 线程控制与线程库
  • ideaIU-2023.2.5.exe install (IntelliJ_IDEA_IU_2023.2.5)
  • 解决海豚调度器跑出数据但显示状态失败(在CDH6.3.2跑离线数仓任务)
  • C#中获取字节数据的高字节和低字节
  • MyBatis-Plus LambdaQueryWrapper 详解:优雅构建类型安全的查询条件
  • 3.25学习总结 抽象类和抽象方法+接口+内部类+API
  • 常用的离散时间傅里叶变换(DTFT)对
  • 网络相关的知识总结1
  • 【Tauri2】002——Cargo.toml和入口文件
  • 【C++】智能指针
  • 计算机组成原理———I\O系统精讲<1>
  • 【redis】哨兵:docker搭建redis环境,容器的编排方式
  • 3D-ViTac:通过视觉-触觉感知学习精细操作
  • 反射机制概述和代码举例
  • 数据库索引相关的面试题以及答案
  • python裁剪nc文件数据
  • Codeforces Round 1011 (Div. 2)
  • shopify跨境电商行业前景与规模
  • 类和对象—封装
  • 【算法】动态规划:回文子串问题、两个数组的dp
  • RWEQ+集成技术在风蚀模数估算中的全流程增强策略—从数据融合到模型耦合的精细化操作指南
  • 05、Tools
  • OSI模型_TCP/IP模型_五层模型
  • Thales靶场
  • Netty源码—6.ByteBuf原理二
  • AI Agent开发大全第十一课-超维空间里的语义翻译官:Embedding技术