二分查找

查找中效率高的方法之一:二分法查找

有序数组查找某个数的索引,不存在返回-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 个可能的结果(-11 或 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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值