搜索旋转排序数组:必有一侧是有序的

一、关键洞察

旋转数组的二分和普通二分只有一个区别:普通二分我们知道整个数组有序,旋转数组中必有一侧是有序的

判断哪一侧有序,然后看 target 是否在这一侧。


二、代码实现

javascript 复制代码
var search = function(nums, target) {
    let left = 0, right = nums.length - 1;
    while (left <= right) {
        const mid = left + Math.floor((right - left) / 2);
        if (nums[mid] === target) return mid;
        
        if (nums[left] <= nums[mid]) {
            if (nums[left] <= target && target < nums[mid]) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        } else {
            if (nums[mid] < target && target <= nums[right]) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
    }
    return -1;
};

三、关键细节

nums[left] <= nums[mid] 判断左侧是否有序。如果左侧有序且 target 在 left 到 mid 之间,收缩到左侧,否则去右侧。

nums[left] > nums[mid] 时,左侧无序则右侧一定有序,同理处理。

<= 而不是 <------当 left === mid 时,nums[left] <= nums[mid] 为 true,左侧被判定为有序(一个元素天然有序)。


四、复杂度

O(log n) 时间,O(1) 空间。


五、总结

  1. 旋转数组二分的关键:必有一侧有序
  2. 判断哪一侧有序,再判断 target 是否在其中
  3. 和普通二分的区别只多了一个条件分支
  4. 不包含重复数字时,numsleft <= numsmid 即可判断
相关推荐
shehuiyuelaiyuehao21 分钟前
算法46,分治快排,排序数组
java·算法·排序算法·排序
Zane19942 小时前
冒泡、选择、插入排序都是O(n²),希尔排序凭什么说自己能更快
算法·排序算法
ysu_03142 天前
19-插入排序与希尔排序
数据结构·算法·排序算法
个 人 练 习 生2 天前
数据结构:排序算法详解
c语言·数据结构·经验分享·学习·算法·排序算法
Msshu1233 天前
2~5串锂电快充优选|XSP36 Type‑C升压/升降压快充管理芯片
数据结构·随机森林·贪心算法·排序算法·线性回归·启发式算法
布莱克6053 天前
C++ 七大排序算法详解:选择、冒泡、插入、计数、堆、快速与归并排序
数据结构·c++·算法·排序算法
LuminousCPP4 天前
数据结构-排序(三):快速排序进阶|挖坑法、双指针交换与手动栈非递归实现
c语言·数据结构·笔记·算法·排序算法
Doubbbbbbble云4 天前
基于空间局部性的排序算法性能重构思路4
java·重构·排序算法
洋不写bug5 天前
排序(一)基础排序,插入|希尔|冒泡|直接选择排序详解
java·算法·排序算法·插入排序·冒泡排序·希尔排序·直接选择排序
王老师青少年编程6 天前
信奥赛csp初赛高频考点【排序算法】(详细解析)
c++·排序算法·csp-j·csp·高频考点·初赛·信奥赛