Algorithms first
搜索旋转排序数组 · 交互式算法学习
在无重复旋转升序数组中搜索目标。
#33 · 二分查找
搜索旋转排序数组
Search in Rotated Sorted Array
nums = [4,5,6,7,0,1,2], target = 0线性序列3 个关键状态
步骤 1mid=3 值 7,左半有序但目标不在其中。
l=44
05
16
27
30
41
52
6推荐
判断有序半边二分
时间
O(log n)空间 O(1)每次至少一半仍有序,判断目标是否落在该半边。
1function search(a, t) {2 let l = 0,3 r = a.length - 1;4 while (l <= r) {5 const m = (l + r) >> 1;6 if (a[m] === t) return m;7 if (a[l] <= a[m]) {8 if (a[l] <= t && t < a[m]) r = m - 1;9 else l = m + 110 } else {11 if (a[m] < t && t <= a[r]) l = m + 1;12 else r = m - 113 }14 }15 return -1;16}多语言参考
来源 · CC BY-SA 4.0 ↗Java · C++ · Go
这是一组同题正确实现,独立于上方当前动画方法;不同语言可能采用另一种正确策略。
1class Solution {2 public int search(int[] nums, int target) {3 int n = nums.length;4 int left = 0, right = n - 1;5 while (left < right) {6 int mid = (left + right) >> 1;7 if (nums[0] <= nums[mid]) {8 if (nums[0] <= target && target <= nums[mid]) {9 right = mid;10 } else {11 left = mid + 1;12 }13 } else {14 if (nums[mid] < target && target <= nums[n - 1]) {15 left = mid + 1;16 } else {17 right = mid;18 }19 }20 }21 return nums[left] == target ? left : -1;22 }23}交互式算法学习
从执行步骤真正理解 LeetCode 经典 150
本站整理 150 道高频算法面试题和 302 种解法。动画方法同步展示 JavaScript 与 Python;每题另提供 Java、C++ 与 Go 同题参考实现。
AlgoViz Lab
搜索旋转排序数组 · 解法对比
在无重复旋转升序数组中搜索目标。
- 测试用例
nums = [4,5,6,7,0,1,2], target = 0- 题目分类
- 二分查找
- 解法对比
- 2
线性扫描
逐项比较直到命中。
- 时间
O(n)- 空间
O(1)
判断有序半边二分
每次至少一半仍有序,判断目标是否落在该半边。
- 时间
O(log n)- 空间
O(1)