条件
- 有序,单调递增或递减
- 存在上下界
- 能够通过索引访问
代码
时间复杂度log(N)
left, right := 0, len(array)-1
for left <= right {
mid := left + (right-left)/2
if array[mid] == target {
break or return
} else if array[mid] < target {
left = mid + 1
} else {
right = mid - 1
}
}
求X的平方根
- 二分查找
func sqrt(x, accuracy float64) float64 {
l, r := 0.0, x
var m float64
for l <= r {
m = l + (r-l)/2
if math.Abs(m-x/m) < accuracy {
return m
} else if m-x/m < 0 {
l = m
} else {
r = m
}
}
return r
}
- 牛顿迭代法
func sqrt(x, accuracy float64) float64 {
r := x
for math.Abs(r-x/r) > accuracy {
r = (r + x/r) / 2
}
return r
}