IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 200道大数据面试常考Leetcode算法题--二分查找篇(python带代码解析) -> 正文阅读

[数据结构与算法]200道大数据面试常考Leetcode算法题--二分查找篇(python带代码解析)

往期内容在这里:

往期01-05

往期06-10

往期11-15

往期16-20

数组篇01

数组篇02

数组篇03

数组篇04

动态规划篇

动态规划进阶(与矩阵相关)

动态规划再进阶(序列类动态规划问题)

大家好,继续为大家推荐200道大数据面试常考Leetcode算法题,这期为--二分查找篇,附带解析,都是从Leetcode官网总结大神们的解法(在这里感谢大神的帮助,我只是个搬运工!)这篇更新6篇,艾瑞巴迪和我一起刷起来!!

200道大数据面试常考Leetcode算法题 (二分查找篇)34-在排序数组中查找元素的第一个和最后一个位置

Leetcode原题为:

?题解为:

class Solution:
        def searchRange(self, nums: List[int], target: int) -> List[int]:
            # 左右端点
            l, r = 0, len(nums)-1
            # 从左往右循环
            while l <= r:
                # 找到中间值的索引
                mid = (l+r)//2
                # 假如中间值就算目标值
                if nums[mid] == target:
                    # 找到中间值左边开始索引跟右边开始索引
                    if nums[l] == target and nums[r] == target:
                        return [l,r]
                     # 没找到 左边右移一位
                    if nums[l] != target:               
                        l += 1
                     # 没找到 右边左移一位
                    if nums[r] != target:               
                        r -= 1
                # 假如目标值大于中间值,则l,r 都在mid右边
                elif nums[mid] < target:  
                # 则重新定义左边从中间值开始变大              
                    l = mid + 1
                # 假如目标值小于中间值,则l,r 都在mid左边
                else: 
                # 则重新定义右边值从中间值开始变小
                    r = mid - 1
            # 没有即返回-1,-1
            return [-1,-1]

200道大数据面试常考Leetcode算法题 (二分查找篇)69-x 的平方根

Leetcode原题为:

题解为:

class Solution(object):
    def mySqrt(self, x):
        # 左边界,因数
        low, high = 0, x
        # 当左边界小于等于因数,开始循环
        while (low <= high):
            # 找到中值
            mid = (low + high) // 2
            # 假如因数平方大于目标值,说明最终符合因数在当前中值的左边边,那么因数减一
            if mid * mid > x:
                high = mid - 1
            # 否则最终符合因数在当前中值的右边
            else:
                low = mid + 1
        # 退出循环,输出当前的因数
        return int(high)

?200道大数据面试常考Leetcode算法题 (二分查找篇)74-搜索二维矩阵

?Leetcode原题为:

题解为:

class Solution:
    def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
        # 对列表的每个列表开始循环
        for list in matrix:
            # 左右边界
            l, r = 0, len(list)-1
            # 左边界小于等于有边界
            while l <= r:
                # 找到中值
                mid = (l+r)//2
                # 假如当前列表的中值为目标值,是即返回True
                if list[mid] == target:
                    return True
                # 假如当前列表的中值小于目标值,说明目标值在中值的右边,左边界变为中值开始加一
                elif list[mid] < target:
                    l = mid+1
                # 假如当前列表的中值大于目标值,说明目标值在中值的左边,右边界变为中值开始减一
                else:
                    r = mid-1
        # 假如找不到目标值即返回False
        return False

200道大数据面试常考Leetcode算法题 (二分查找篇)153-寻找旋转排序数组中的最小值

Leetcode原题:

?题解为:

class Solution:
    def findMin(self, nums: List[int]) -> int:
        # 左右边界
        l,r = 0,len(nums)-1
        # 左边界小于右边界开始循环
        while(l < r):
            # 计算中值索引
            mid = (l + r) // 2
            # 假如中值大于右边界,说明最小值在右边界,重新开始让区间左边界变为从中值+1
            if(nums[mid] > nums[r]):
                l = mid+1
            # 假如中值小于等于右边界,说明最小值在左边界,重新开始让区间右边界变为从中值开始
            else:
                r = mid
        # 最后当左右边界相同的时侯,即找到最小值
        return nums[l]

200道大数据面试常考Leetcode算法题 (二分查找篇)278-第一个错误的版本

Leetcode原题为:

题解为:

class Solution:
    def firstBadVersion(self, n):
        # 定义左右边界,因为是版本是一个个体,所以从1开始
        l,r = 1,n
        # 当左边界小于右边界循环
        while (l<r):
            # 找到中间索引
            mid = (l+r)//2
            # 判断中值是否为错误版本,假如是,
            # 即表示第一个错误版本在左边,重新开始让区间右边界变为从中值开始
            if isBadVersion(mid):
                r = mid
            # 否则表示第一个错误版本在右边,重新开始让区间左边界变为从中值+1开始
            else:
                l = mid+1
        # 当左右边界相等时即找到第一个错误版本
        return l

200道大数据面试常考Leetcode算法题 (二分查找篇)540-有序数组中的单一元素

Leetcode原题为:

?题解为:

class Solution:
    def singleNonDuplicate(self, nums: List[int]) -> int:
        l,r = 0,len(nums)-1
        while(l < r):
            mid = (l+r) // 2
            # 右侧数组为偶数
            halvesAreEven = (l - mid) % 2 == 0
            # 假如中值和中值后面的数是一对时
            if(nums[mid] == nums[mid + 1]):
                # 否则右侧数组为偶数,说明单一数字在右侧,重新开始让区间左边界变为从中值+2开始
                # 因为中值右侧有一个跟中间相同,所以不能右侧此时不能是偶数
                if(halvesAreEven):
                    l = mid + 2
                # 否则左侧数组为偶数,说明单一数字在右侧,重新开始让区间左边界变为从中值+2开始
                else:
                    r = mid - 1
            # 假如中值和中值前面的数是一对时
            elif(nums[mid] == nums[mid - 1]):
                 # 假如右侧数组为偶数,说明单一数字在左侧,重新开始让区间右边界变为从中值-2开始
                if(halvesAreEven):
                    r = mid -2
                # 否则左侧数组为偶数,说明单一数字在右侧,重新开始让区间左边界变为从中值+1开始
                else:
                    l = mid + 1
            # 否则中值就是单一数字
            else:
                return nums[mid]
        # 当左右边界相同时,即找到单一数字
        return nums[l]

好啦,这期的分享到这里结束啦!我们下期(位运算篇)再见!

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-09-02 11:37:50  更:2021-09-02 11:38:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/30 0:53:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码