704 二分查找(Python)
2024-04-09 21:50:05  阅读数 240

来源:力扣(LeetCode)简单题

链接:https://leetcode-cn.com/problems/binary-search

题目描述:

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
示例1:

输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4

示例2:

输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1

思路:

本题采用二分法,我们要明确搜索区间。
首先我们要找到该区间的中间值mid=(start+end)/2。然后将目标值target和中间值进行比较,由题可知该数组为有序(升序)整型数组。若nums[mid] ==target,说明目标值就是nums[mid],查找成功,并返回该位置;若nums[mid]>target,目标值在mid的左边;若nums[mid]<target,则目标值在mid的右边。

注意点:

(1)start与end的初始值
(2) while里的判断语句是否有等号,本题采用左闭右开的区间定义,所以while括号内使用<=
(3) target与mid大小比较后,start与end的赋值
(4)二分法的前提条件:有序且无重复元素

#代码
class Solution:
    def search(self, nums: List[int], target: int) -> int:
            start = 0
            end = len(nums)-1
            while (start <= end):
                medium = int((start+end)/2)
                if nums[medium] == target:
                    return medium
                if nums[medium] > target:
                    end = medium-1
                else:
                    start = medium+1
            if (end <0 or nums[end]!=target):
                return -1