列表查找
列表查找(线性表查找):从列表中查找指定元素
输入:列表、待查找元素
输出:元素下标(未找到元素时一般返回None或-1)
内置列表查找函数:index()
文章目录
一、顺序查找(Linear Search)
顺序查找:也叫线性查找,从列表第一个元素开始,顺序进行搜索,直到找到元素或搜索到列表最后一个元素为止。
时间复杂度:O(n)
def linear_search(li,val):
for idx,v in enumerate(li):
if v==val:
return idx
else:
return None
二、二分查找(Binary Search)
二分查找:折半查找,从有序列表的初始候选区li[0:n]开始,通过对待查找的值与候选区中间值的比较,可以使候选区减少一半
注意:二分查找必须先排序
时间复杂度:O(log(n))
def binary_search(li,val):
left=0
right=len(li)-1
while left<=right: #候选区有值
mid=(left+right)//2
if li[mid]==val:
return mid
elif li[mid]>val: #待查找的值在mid左侧
right=mid-1
else: #待查找的值在mid右侧
left=mid+1
return None
三、二分查找-leetcode
简单题
1. leetcode-35-搜索插入位置
def searchInsert(self,nums,target):
left=0
right=len(nums)-1
while left<=right:
mid=(left+right)//2
if target<=nums[mid]:
right=mid-1
else:
left=mid+1
return left
2. leetcode-69-x的平方根
def mySqrt(self,x):
left=1
right=x
while left<=right:
mid=(left+right)//2
if mid*mid==x:
return mid
elif mid*mid<x:
left=mid+1
else:
right=mid-1
return left-1
3. leetcode-268-丢失的数字
def missingNumber(self,nums):
left=0
right=len(nums-1)
nums.sort()
while left<=right:
mid=(left+right)//2
if nums[mid]<=mid:
left=mid+1
else:
right=mid-1
return left
4. leetcode-278-第一个错误的版本
def firstBadVersion(self,n):
left=1
right=n
while left<=right:
mid=(left+right)//2
if isBadVersion(mid)==True:
right=mid-1
else:
left=mid+1
return left