题目:给一个有序数组,在这个有序数组里找到一个目标值,别返回他的下标
python解法
class Solution:
def search(self, nums: List[int], target: int) -> int:
left = 0
right = len(nums)-1
# 如果如上,找到最后left和right落在同一个元素上,所以有相等的情况
while left <= right :
# 取中间的下标
mid = (left+right)//2
# 先对比中间的元素是否是目标值
if nums[mid] == target:
return mid
elif nums[mid] > target:
right = mid-1
else:
left = mid+1
# 跳出循环表示没找到
return -1
golang解法
func search(nums []int, target int) int {
start := 0
end := len(nums)
for start < end{
//取中间值
mid := (start + end)/2
//判断中间值是否大于目标值
if nums[mid] > target{
end = mid
//判断中间值是否小于目标值
} else if nums[mid] < target{
start = mid + 1
//找到目标值,返回下标
} else{
return mid
}
}
//没有返回-1
return -1
}
时间复杂度 logn
解题思路:
1:⚠️区间边界的定义非常重要
如果刚开始定义的是左闭右闭,那之后的缩小范围也要保持左闭右闭
2:⚠️什么时候停止?
二分法一定要清楚最后找到什么元素,没找到停止,
向上面的python解法,左闭右闭,最后就是找到left和right是一个值的时候是最后一个元素,所以他有left=right的情况,如果是左闭右开就没有相等的情况。