前言
二分查找是力扣上的一道简单题,题号704。评论里面有人戏称这题这叫做算法第一题。
也许是因为它是《图解算法》上的第一道题目吧,这本书对于新人确实是比较友好。
题目描述: 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
解题思路: 定义两个指针,一个在数组的最左侧,一个在数组的最右侧。当左指针小于等于右指针,每次取数组的中间那个元素,将目标值与中间元素对比。如果目标值大于中间元素,则将左指针移到中间值索引 + 1的位置。如果目标值小于中间元素,则将右指针移动到中间值索引 - 1的位置。如果目标值等于中间元素则返回索引。
javascript代码:
const search = (nums, target) => {
// 定义左指针在数组最左侧,右指针在数组最右侧
let left = 0, right = nums.length - 1
while(left <= right) {
let mid = Math.floor((left + right)/2) // 中间元素的索引
let num = nums[mid] // 中间值
if (target === num) { // 找到目标值,返回索引
return mid
} else if (target > num ) {
left = mid + 1
} else {
right = mid - 1
}
}
return -1 // 没有找到返回 -1
}
go代码:
func search(nums []int,target int) int {
left,right := 0,len(nums) - 1
for left <= right {
mid := (left + right)/2
num := nums[mid]
if target == num {
return mid
} else if target > num {
left = mid + 1
} else {
right = mid - 1
}
}
return -1
}