数组小技巧
- Go语言中,数组下标从0开始
- 数组的内存空间是连续的
- 使用时候注意下标要小于数组长度,否则容易发生数组越界
二分查找
原理:简单总结下二分查找就是在某个有序集合内,通过不断缩减查找范围提升查询效率。对于有序数组使用二分查找可以简单、快速查找到目标值
leetcode-704.二分查找
暴力解法
func search(nums []int, target int) int {
for i := range nums {
if nums[i] == target {
return i
}
}
return -1
}
很明显遍历时候做了很多无效查询
时间复杂度O(n)
二分查找
通过题目知道集合是有序的,那么可以通过二分查找提高查询效率。
- h取值为数组长度-1
- 结束条件l=h时候是否可以呢,试想下假如nums集合只有一个元素,肯定要l=h
func search(nums []int, target int) int {
// h的取值注意是数组长度-1
l, h := 0, len(nums) - 1
for l <= h {
// 防止溢出
p := l + (h - l)/2
if nums[p] == target {
// 查找目标值,返回下标
return p
} else if nums[p] > target {
// 由于集合为生序中间值大于目标值,目标值应该在左侧区间内
h = p - 1
} else {
l = p + 1
}
}
return -1
}