Menu
CoddyTech

Search in Rotated Sorted Array

中等二分查找python iconjava iconcpp iconc iconjs icon+10

一个由互不相同的整数组成的列表先按升序排列,然后进行了旋转:从列表开头取出任意数量的元素(也可以不取),并按原顺序移到列表末尾。例如,[2, 5, 8, 11, 15, 19, 23]旋转 4 位后变为[15, 19, 23, 2, 5, 8, 11]。给你旋转后的列表nums和一个整数target。请返回target在nums中的索引(从 0 开始计数);如果不存在,则返回-1。要求时间复杂度为O(log n)。

函数

search(nums: integer-array, target: integer) → integer
numsinteger-array
旋转后的不重复整数列表
targetinteger
要查找的值
返回值integer
target 在 nums 中的索引;如果不存在,则为 -1

约束条件

  • 1 ≤ nums.length ≤ 5000
  • -104 ≤ nums[i], target ≤ 104
  • 所有 nums 中的值都不相同。
  • nums 是一个递增列表,经过了某个 k 值的旋转,其中 0 ≤ k < nums.length;k = 0 表示列表没有旋转。

示例

输入
nums = [15, 19, 23, 2, 5, 8, 11]target = 5
输出
4
解释
索引 3 处的第一个中间元素是 2,因此右半部分 [2, 5, 8, 11] 已排序,其中包含 5。接下来,索引 5 处的中间元素是 8;已排序的左侧部分 [5, 8] 包含 5,因此得到索引 4。
challenge icon

进阶

如果 nums 中可能有重复项,就没有算法能保证时间复杂度为 O(log n)。你能用一个经过旋转、由多个 1 和一个被隐藏的 0 组成的列表来证明这一点吗?

重置代码
def search(nums, target):
    # 在这里编写代码

测试 #1

测试 #2

测试 #3

参数

nums = [15, 19, 23, 2, 5, 8, 11]
target = 5

预期输出

4