0%

LeetCode.搜索旋转排序数组II

假设按照升序排序的数组在预先未知的某个点上进行了旋转。(例如,数组 [ 0,0,1,2,2,5,6 ]可能变为 [ 2,5,6,0,0,1,2 ])。编写一个函数来判断给定的目标值是否存在于数组中。若存在返回true,否则返回false。

  1. 示例 1:
    输入: nums = [2,5,6,0,0,1,2], target = 0
    输出: true
  2. 示例 2:
    输入: nums = [2,5,6,0,0,1,2], target = 3
    输出: false

二分查找

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
object RotateSearchII {
def main(args: Array[String]): Unit = {
println(search(Array(2, 5, 6, 0, 0, 1, 2), 0))
println(search(Array(2, 5, 6, 0, 0, 1, 2), 3))
println(search(Array(1, 3, 1, 1, 1), 3))
println(search(Array(1, 1, 1, 1, 1, 1, 1, 3, 1), 3))
}

def search(nums: Array[Int], target: Int): Boolean = {
if (nums.length == 0) return false
var l = 0
var r = nums.length - 1

if (target > nums(r) && target < nums(l)) return false
else if (nums(l) == target) return true
else if (nums(r) == target) return true

if (nums.length == 1) {
if (nums(0) == target) return true else return false
}

while (l < r) {
val m = (l + r) / 2
if (nums(l) == target || nums(m) == target || nums(r) == target) return true
val newPos = calNewLR(l, r, m, nums, target)
l = newPos._1
r = newPos._2
}

false
}

def calNewLR(l: Int, r: Int, m: Int, nums: Array[Int], target: Int): (Int, Int) = {
var nL = l
var nR = r
if (nums(l) < nums(r)) {
if (target > nums(m)) {
nL = m + 1
} else {
nR = m - 1
}
} else {
if (nums(m) < nums(l)) {
if (target > nums(m)) {
if (target > nums(r)) {
nR = m - 1
} else {
nL = m + 1
}
} else {
nR = m - 1
}
} else if (nums(m) > nums(l)) {
if (target > nums(m)) {
nL = m + 1
} else {
if (target > nums(l)) {
nR = m - 1
} else {
nL = m + 1
}
}
} else {
nL += 1
}
}
(nL, nR)
}
}