题解 | #数字在升序数组中出现的次数# | Golang
package main
import "fmt"
// 二分查找函数
func search(nums []int, target int) int {
left, right := 0, len(nums)-1
for left <= right {
mid := left + (right-left)/2
if nums[mid] == target {
return mid
} else if nums[mid] < target {
left = mid + 1
} else {
right = mid - 1
}
}
return -1
}
func searchBitonicSequence(nums []int, target int) int {
n := len(nums)
left, right := 0, n-1
while left <= right {
mid := left + (right-left)/2
if nums[mid] == target {
return mid
}
// 当前点不是target,则可能在递增或递减的序列里
// 如果中点大于下一个元素,说明我们在递增序列里,继续在左半边查找
if mid+1 < n && nums[mid] > nums[mid+1] {
right = mid - 1
} else {
left = mid + 1
}
}
return -1
}
func main() {
nums := []int{1, 3, 8, 12, 15, 19, 20}
target := 15
fmt.Println(searchBitonicSequence(nums, target)) // 输出 4
}
这段代码首先定义了一个二分查找函数search
,然后定义了searchBitonicSequence
函数来处理位于峰顶序列中的目标值的查找。searchBitonicSequence
函数通过检查中点是否在递增序列的边界来决定是在左半边还是右半边继续查找,直到找到目标值或确定目标值不在数组中。最后在main
函数中通过样例数组和目标值进行测试。
评论已关闭