五月集训 Day09 二分查找


前言

        第9天:二分查找
        二分查找也称折半查找(Binary Search),是一种在有序数组中查找某一特定元素的搜索算法。我们可以从定义可知,运用二分搜索的前提是数组必须是有序的,二分查找的时间复杂度为O( log ⁡ 2 n \log_2 n log2n),除了查找元素,衍生出的有如查找左区间,右区间等,查找对象也从有序数组衍生出有如螺旋数组等,有关此类的参考资料十分多,在此我强推一波参考链接1,总结的很详细也很生动。


一、练习题目

题目链接难度
35. 搜索插入位置★☆☆☆☆
704. 二分查找★☆☆☆☆
剑指 Offer 53 - I. 在排序数组中查找数字 I★☆☆☆☆
33. 搜索旋转排序数组★★☆☆☆

二、思路与代码

1. 搜索插入位置

        题目描述:
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(log n) 的算法。

解题思路:
        1)
        2)

class Solution(object):
    def searchInsert(self, nums, target):
        l, r = 0, len(nums)-1
        while l <= r:
            mid = l + (r - l) // 2
            if nums[mid] == target:
                return mid
            if target < nums[mid]:
                r = mid - 1
            if target > nums[mid]:
                l = mid + 1
        return l

2. 二分查找

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

解题思路:
        只需要把第一题返回值修改一下就可以了。

class Solution(object):
    def searchInsert(self, nums, target):
        l, r = 0, len(nums)-1
        while l <= r:
            mid = l + (r - l) // 2
            if nums[mid] == target:
                return mid
            if target < nums[mid]:
                r = mid - 1
            if target > nums[mid]:
                l = mid + 1
        return l

3. 在排序数组中查找数字 I

        题目描述:
统计一个数字在排序数组中出现的次数。

解题思路:
        1)用二分法查找大于等于target目标值的下标ans;
        2)从下标ans处遍历数组,找到大小等于target的个数。

class Solution(object):
    def search(self, nums, target):
        l, r = 0, len(nums)-1
        cnt, ans = 0, 0
        if len(nums) == 0:
            return 0
        while l <= r:
            mid = l + (r - l) // 2
            if nums[mid] >= target:
                ans = mid
                r = mid - 1
            else:
                l = mid + 1
        if ans == len(nums) or nums[ans] != target:
            return 0
        else:
            while(ans < len(nums) and nums[ans] == target):
                cnt += 1
                ans += 1
        return cnt

4. 题目标题

        题目描述:

解题思路: https://leetcode.cn/problems/search-in-rotated-sorted-array/solution/sou-suo-xuan-zhuan-pai-xu-shu-zu-by-leetcode-solut/

class Solution(object):
    def search(self, nums, target):
        if not nums:
            return -1
        l, r = 0, len(nums) - 1
        while l <= r:
            mid = (l + r) // 2
            if nums[mid] == target:
                return mid
            if nums[0] <= nums[mid]:
                if nums[0] <= target < nums[mid]:
                    r = mid - 1
                else:
                    l = mid + 1
            else:
                if nums[mid] < target <= nums[len(nums) - 1]:
                    l = mid + 1
                else:
                    r = mid - 1
        return -1

参考资料
[1]穿几个马甲,就认不出你是二分法?https://mp.weixin.qq.com/s/1ExIav9uK4bvVnnf4t0H2Q

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值