Search in Rotated Sorted Array

Suppose a sorted array is rotated at some pivot unknown to you beforehand.

(i.e.,0 1 2 4 5 6 7might become4 5 6 7 0 1 2).

You are given a target value to search. If found in the array return its index, otherwise return -1.

You may assume no duplicate exists in the array.

Example

For[4, 5, 1, 2, 3]andtarget=1, return2.

For[4, 5, 1, 2, 3]andtarget=0, return-1.

Note1

M1可能落在左半边, 也可能落在右半边. M1 >= S1, 左; M1 < S1, 右

即把数组分为了两部分,粉色部分[S,M]和橙色部分[M]

我们想去掉一半, 让它仍保持RSA(rotated sorted array)

如果M落在左, 切掉[S,M]; 如果M落在右, 切掉[M,E]

分类讨论,这里选择比较和mid和start位置数的大小来决定抛弃哪一半:

nums[mid] == target --> return mid

nums[start] < nums[mid]: 在左边

  • nums[start] <= target <= nums[mid] --> 在左边:end = mid

  • else --> 在右边: start = mid

start >= mid: 在右边

  • nums[mid] <= target <= nums[end] --> 在右边:start = mid

  • else --> 在左边: end = mid

Code1

Note2

如果我们这里允许重复, 这里考虑最坏情况:

二分法,增加一个分支,最坏情况会一直增加,这样就是O(n):

Code2

Last updated