33. 搜索旋转排序数组
xxxixxxx

33. 搜索旋转排序数组

33. 搜索旋转排序数组

二分法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
class Solution {
func search(_ nums: [Int], _ target: Int) -> Int {
if nums.isEmpty {
return -1
}
if nums.count == 1 {
return (nums[0] == target) ? 0 : -1
}

var left = 0
var right = nums.count - 1

// left <= right 说明相遇了 在变就错过
while left <= right {
// 确定中间值
let mid = (right - left) / 2 + left
if nums[mid] == target {
return mid
}
// nums[mid] < nums[right] 说明 mid 右边是有序递增的
if nums[mid] < nums[right] {
//如果 target 值在这个有序递增的范围内那就能确定 left 了,这里包含了右边等于 target 值的情况
if target > nums[mid], target <= nums[right] {
left = mid + 1
} else {
right = mid - 1
}
} else { // nums[mid] > nums[right] 说明突变值(最小值)在 mid 右边,则 mid 左边是有序递增的
if target >= nums[left], target < nums[mid] {
//如果 target 值在这个有序递增的范围内那就能确定 right 了,这里包含了左边等于 target 值的情况
right = mid - 1
} else {
left = mid + 1
}
}
}
return -1
}
}
  • Post title:33. 搜索旋转排序数组
  • Post author:xxxixxxx
  • Create time:2021-02-21 22:21:00
  • Post link:https://xxxixxx.github.io/2021/02/21/2000-004-33. 搜索旋转排序数组/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.
 Comments