← [ BACK_TO_NOTES ]

搜索旋转排序数组

LeetCode 33:二分时判断哪一半有序,再决定收缩区间。

#algorithm #snippet #evergreen #leetcode #binary-search #array

[!info] related notes 算法面试题型 MOC 二分查找

搜索旋转排序数组

题目

33. 搜索旋转排序数组 - 力扣(LeetCode)

思路

数组由严格升序、元素互异的数组旋转得到,也允许没有实际旋转。任意时刻 [l, mid] 或 [mid, r] 至少有一半有序;先检查 mid 是否命中,再用有序侧的值域排除一半。

  • 若 nums[l] <= nums[mid],说明左半有序
    • 若 target 落在 [nums[l], nums[mid]),去左边,否则去右边
  • 否则右半有序
    • 若 target 落在 (nums[mid], nums[r]],去右边,否则去左边

重复值会破坏下面的判断,例如 [1, 0, 1, 1, 1] 中首中尾相等,不能据此直接排除左侧。带重复版本需要额外消歧,最坏可退化到 O(n);本题互异前提下为 O(log n),空间 O(1)。

代码(JavaScript)

var search = function(nums, target) {
  let l = 0, r = nums.length - 1;
  while (l <= r) {
    const mid = Math.floor((l + r) / 2);
    if (nums[mid] === target) return mid;

    if (nums[l] <= nums[mid]) {
      // left half is sorted
      if (nums[l] <= target && target < nums[mid]) r = mid - 1;
      else l = mid + 1;
    } else {
      // right half is sorted
      if (nums[mid] < target && target <= nums[r]) l = mid + 1;
      else r = mid - 1;
    }
  }
  return -1;
};
创建于 2026/3/16 更新于 2026/10/7
Digital Biome
Access

键盘导航

j / k / ↑ / ↓
选择对象
Enter / o
打开选择
/ 或 Ctrl+K
全站搜索
i / f / 1–4
筛选当前列表
g → h / l / p / t / a
首页 / 笔记 / 项目 / 工具 / About
r → 1–9
打开所选对象的关联
u
返回上一页
Esc
关闭浮层 / 取消命令;输入框内清空文本