查找中效率高的方法之一:二分法查找
有序数组查找某个数的索引,不存在返回-1
给定一个 n
个元素有序的(升序)整型数组 nums
和一个目标值 target
,写一个函数搜索 nums
中的 target
,如果目标值存在返回下标,否则返回 -1
例一:
输入: nums = [-1,0,3,5,9,12], target = 9 输出: 4 解释: 9 出现在 nums 中并且下标为 4
例二:
输入: nums = [-1,0,3,5,9,12], target = 2 输出: -1 解释: 2 不存在 nums 中因此返回 -1
class Solution:
def search(self, nums: List[int], target: int) -> int:
low, high = 0, len(nums)
while low < high:
mid = (low + high) // 2
if nums[mid] == target:
return mid
elif nums[mid] < target:
low = mid + 1
else:
high = mid
return -1
- 示例1:leetCode 374. 猜数字大小
我们正在玩一个猜数字游戏。 游戏规则如下:我从 1 到 n 选择一个数字。 你需要猜我选择了哪个数字。每次你猜错了,我会告诉你这个数字是大了还是小了。你调用一个预先定义好的接口 guess(int num)
,它会返回 3 个可能的结果(-1
,1
或 0
):
- 示例2:
Python代码实现
def findClosestElements(nums,target,k):
left, right = 0, len(nums) - k
while left < right:
mid = (left + right) //2
# print("mid",mid)
if abs(nums[mid]-target) > abs(nums[mid+k]-target):
left = mid + 1
else:
right = mid
return nums[left:left+k]
# print(nums[left:left+k])
# print([i for i in range(left,left+k)])
if __name__ == '__main__':
nums = [1, 4, 5, 6, 11, 13]
result=findClosestElements(nums,12,3)
print(result)
递归完成二分法:
lst=[22,33,35,42,45,70,89,103,408,478]
def func(n,left,right):
if left<=right:
mid=(left+right)//2
if n>lst[mid]:
left=mid+1
return func(n,left,right)
elif n<lst[mid]:
right=mid-1
return func(n,left,right)
elif n==lst[mid]:
print("找到了")
return mid
else:
print("没有这个数")
return -1
func(77,0,len(lst)-1)
查找的最快的方式:将索引变成另一个的下标
lst1=[5,6,7,8]
lst2=[0,0,0,0,0,0,0,0]
for el in lst1:
lst2[el]=1
# lst2变成:
lst2=[0,0,0,0,1,1,1,1]
# 判断要查找的数字的索引的值是否等于1
lst2[4]==1