跟着LeetCode的Study Plan重温一遍各种经典算法,本期是二分搜索算法Level1 Day1。
题目构成:Easy*2
。
最基础的二分搜索,从有序数组中查找目标值,代码(Golang)如下:
func search(nums []int, target int) int {
i, j := 0, len(nums)-1
if nums[i] > target || nums[j] < target {
return -1
}
for i <= j {
k := (i + j) / 2
v := nums[k]
// fmt.Println(i, k, j, v)
if v == target {
return k
} else if v > target {
j = k - 1
} else {
i = k + 1
}
}
return -1
}
需要注意的点有3个:
target
是否在数组中,以优化效率i<=j
,包含等于k
之后,缩小区间需要-1
或+1
,避免计算中值时固定在一个点在指定范围内猜数字,和基础的二分搜索几乎一样,代码(Golang)如下:
func guess(num int) int
func guessNumber(n int) int {
i, j := 1, n
for i <= j {
k := (i + j) / 2
v := guess(k)
if v == 0 {
return k
} else if v == 1 {
i = k + 1
} else {
j = k - 1
}
}
return -1
}
代码中的guess
函数在题目中是内置的,不需要自己提供。