题目描述:
给定一个 n
个元素有序的(升序)整型数组 nums
和一个目标值 target
,写一个函数搜索 nums
中的 target
,如果目标值存在返回下标,否则返回 -1
。
二分查找介绍:
二分查找是一种高效的查找算法,用于在有序数组中查找特定元素。它的基本思想是将查找区间不断缩小,每次将待查找区间缩小一半,直到找到目标元素或确定元素不存在。
二分查找的主要特点:
-
要求数组必须是有序的(通常是升序)。
-
时间复杂度为 O(log n),非常高效。
-
只适用于可以随机访问的数据结构(如数组)
核心代码:
func binarySearch(arr []int, target int) int {
left := 0
right := len(arr) - 1
for left <= right {
mid := left + (right-left)/2 // 避免整数溢出
if arr[mid] == target {
return mid // 找到目标元素,返回索引
} else if arr[mid] < target {
left = mid + 1 // 目标在右半部分
} else {
right = mid - 1 // 目标在左半部分
}
}
return -1 // 未找到目标元素
}
工作原理:
1. 初始化左指针 `left` 为数组起始位置,右指针 `right` 为数组末尾位置。
2. 在 `left <= right` 的条件下进行循环:
- 计算中间位置 `mid`。使用 `left + (right-left)/2` 而不是 `(left+right)/2` 可以避免整数溢出。
- 如果中间元素等于目标值,返回该位置。
- 如果中间元素小于目标值,将搜索范围缩小到右半部分。
- 如果中间元素大于目标值,将搜索范围缩小到左半部分。
3. 如果循环结束还没找到目标元素,返回 -1 表示未找到。