4_leetcode力扣_二分法查找_BinarySearch_Easy

题目

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

难度

简单

相关知识

数组 二分查找

题解

  1. 暴力查找法
    在这里插入图片描述
  • range函数
class Solution:
    def search(self, nums: List[int], target: int) -> int:
        for i in range(len(nums)):
            if nums[i]== target:
                return i
        return -1

range函数是python内置函数,允许用户在给定范围内生成一系列数字。根据用户传递给函数的参数变量来决定数字的开始和结束位置以及一个数字与另一个数字之间的差异。主要用于循环。
语法结构

range(start,stop,step)
#start:表示从返回序列的起始编号,默认情况下从0开始
#stop:表示上限但不包括此数字的数字
#step:指的是序列中每个数字之间的差异,默认值为1
#range(5)等价于range(0,5,1)
  • enumerate函数
class Solution:
    def search(self, nums: List[int], target: int) -> int:
        for index,value in enumerate(nums):
            if value == target:
                return index
        return -1

enumerate是python 的内置枚举函数,对于一个可迭代的(iterable)/可遍历的对象(如列表、字符串),enumerate将其组成一个索引序列,利用它可以同时获得索引和值。
仔细观察上面代码中for循环+enumerate()函数的搭配使用,序列使用过该函数后,会返回元素下标和元素组合的元组,我们采用序列解包的方式,将其赋值给了index和value,其中index表示lis列表中每个元素的下标,value表示lis列表中每个元素的值。
序列解包:

x, y = (12, 54)
print(x)  # 12
print(y)  # 54
  • 二分法
    设定左右指针,找出中间位置,并判断该位置值是否等于 target。
    定义查找的范围 ,初始查找范围是整个数组。每次取查找范围的中点与target比较 大小,如果相等则 mid 即为要寻找的下标,如果不相等则根据大小关系将查找范围缩小一半。

  • 错误记录
    在这里插入图片描述

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        left,right = 0,len(nums)-1
        while left<right:
            m = (left+right)//2 #i与j的中间值middle
            if nums[m]== target:
                return m
            elif nums[m]<target:
                left = m
            else :
                right = m
        return -1

主要问题出现在left = m和right = m中,当m不等于target时,m应该前进或后退。

  • 改正
    在这里插入图片描述
class Solution:
    def search(self, nums: List[int], target: int) -> int:
        left,right = 0,len(nums)-1
        while left<=right:
            m = (left+right)//2 #i与j的中间值middle
            if nums[m]== target:
                return m
            elif nums[m]<target:
                left = m+1
            else :
                right = m-1
        return -1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值