观察发现,无论数组怎么旋转,始终会有半边有序。当中间数小于右边数时,右半边有序;中间数大于右边数时,左半边有序。 所以可以根据判断有序段边界来确定目标在哪半边。
0 1 2 4 5 6 7
7 0 1 2 4 5 6
6 7 0 1 2 4 5
5 6 7 0 1 2 4
4 5 6 7 0 1 2
2 4 5 6 7 0 1
1 2 4 5 6 7 0
golang
func search(nums []int, target int) int {
if len(nums) == 0 {
return -1
}
l, r := 0, len(nums)-1
for l <= r {
mid := (l + r) / 2
if nums[mid] == target {
return mid
} else if nums[mid] > nums[r] {
if target < nums[mid] && target >= nums[l] {
r = mid - 1
} else {
l = mid + 1
}
} else {
if target > nums[mid] && target <= nums[r] {
l = mid + 1
} else {
r = mid - 1
}
}
}
return -1
}