题目
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -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