Grind75第8天 | 278.第一个错误的版本、33.搜索旋转排序数组、981.基于时间的键值存储

news2024/9/26 3:32:15

278.第一个错误的版本

题目链接:https://leetcode.com/problems/first-bad-version

解法:

二分查找。

如果一个版本为错误版本(isBadVersion为True),那么第一个错误版本在该版本左侧(包括该版本);如果一个版本为正确版本,那么第一个错误版本在该版本的右侧(不包括该版本)。

如此不断收缩范围,直到left和right指针相等。

注意,这里的判断条件是 while left < right,为啥不是 while left <= right呢?我之前二分查找统一写成左闭右闭,所以判断条件是 while left <= right ,但是这个题,right 的更新是 right = mid,而不是 right = mid + 1,那么如果判断条件加了 = 号,就可能会无限循环下去。比如 [1,2,3,4,5],版本为 [false, false, false, true, true],那么第一个错误版本是4,第一轮判断后 left=4,right=5,第二轮判断时 mid=4,那么right=mid=4,这样 while left <= right 就会一直满足,永远循环下去。

边界条件:无

时间复杂度:O(logn)

空间复杂度:O(1)

# The isBadVersion API is already defined for you.
# def isBadVersion(version: int) -> bool:

class Solution:
    def firstBadVersion(self, n: int) -> int:
        left, right = 1, n
        while left < right:
            mid = left + (right - left ) // 2
            if isBadVersion(mid):
                # 错误版本在 [left, mid] 这个闭区间
                right = mid
            else:
                left = mid + 1
        return left

33.搜索旋转排序数组

题目链接:https://leetcode.com/problems/search-in-rotated-sorted-array

解法:

二分查找,统一写左闭右闭区间:while循环时,left <= right。

这个题,麻烦还是在于条件判断时,要不要加 == 符号,比如有时候是 <=,有时候又是 < ,非常容易搞错。我暂时也没想到好的办法。

nums[mid] >= nums[left] 这个条件里加了等号,比如 [3,1],查找1,这个例子可以验证必须加等号。

以下是官方题解的图:

其他的参考题解。

参考题解:二分查找

边界条件:

时间复杂度:O(logn)

空间复杂度:O(1)

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        left, right = 0, len(nums) - 1
        while left <= right:
            mid = left + (right - left) // 2
            if nums[mid] == target:
                return mid
            # 注意这里有等号
            if nums[mid] >= nums[left]:
                # 正因为target不等于nums[mid],所以需要mid左移一位
                if target >= nums[left] and target < nums[mid]:
                    right = mid - 1
                else:
                    left = mid + 1
            else:
                # 正因为target > nums[mid] 而不是相等,所以mid肯定不是target的位置,而是右移一位,于是left = mid + 1
                if target > nums[mid] and target <= nums[right]:
                    left = mid + 1
                else:
                    right = mid - 1
        return -1

981.基于时间的键值存储

题目链接:https://leetcode.com/problems/time-based-key-value-store

解法:

这个题用二分查找。我们构造哈希map,值是一个列表,元素是pair对 [value, timestamp],由于timestamp是升序的,所以我们用二分查找来做。那么我们要找到小于等于目标timestamp的数中,最大的一个。

这个题很多题解都没有说明一个关键问题,那就是在二分查找中,如果target不在升序数组nums里面,那么查找结束时,left和right分别是代表什么。

举个例子 nums=[1,3,5,6,7],target=4,按照左闭右闭的二分查找写法,那么当left > right 时,查找结束,即 left=2, right = 1。可以看到 nums[left] 表示第一个大于target的数,而 nums[right] 表示小于target的数中,最大的一个。

所以这个题,如果调用get函数时,进行二分查找,如果目标timestamp不在哈希map中,那么查找结束时,left > right。如果left >0, right >=0,那么我们可以通过 left-1来获取答案,也可以通过right来获取答案。

参考题解:二分查找

边界条件:无

时间复杂度:O(logn)

空间复杂度:O(n)

class TimeMap:

    def __init__(self):
        self.map = {}

    def set(self, key: str, value: str, timestamp: int) -> None:
        if key not in self.map:
            self.map[key] = []
        self.map[key].append([value, timestamp])

    def get(self, key: str, timestamp: int) -> str:
        if key not in self.map: return ''

        kv_list = self.map[key]
        left, right = 0, len(kv_list) - 1
        while left <= right:
            mid = left + (right - left) // 2
            # 如果等于,那么直接返回
            if kv_list[mid][1] == timestamp:
                return kv_list[mid][0]

            if kv_list[mid][1] > timestamp:
                right = mid - 1
            else:
                left = mid + 1
        # 当left>right时,停止循环,那么[:right]区间是 < timestamp,[left:]区间是>timestamp的
        if left > 0:
            return kv_list[left-1][0]
        return ''           


# Your TimeMap object will be instantiated and called as such:
# obj = TimeMap()
# obj.set(key,value,timestamp)
# param_2 = obj.get(key,timestamp)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1380001.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nova组件讲解和glance对接swift

1、openstack架构 &#xff08;1&#xff09;openstack是一种SOA架构&#xff08;微服务就是从这种架构中剥离出来的&#xff09; &#xff08;2&#xff09;这种SOA架构&#xff0c;就是把每个服务独立成一个组件&#xff0c;每个组件通过定义好的api接口进行互通 &#xff…

RK3568平台 温度传感器芯片SD5075

一.SD5075芯片简介 SD5075 是一款高准确度温度传感器芯片内含高精度测温 ADC&#xff0c;在-40C ~100C 范围内典型误差小于0.5C&#xff0c;在-55C~125C 范围内典型误差小于士1.0C。通过两线 IC/SMBus接口可以很方便与其他设备建立通信。设置 A2~A0 的地址线&#xff0c;可支持…

如何使用“通义听悟”提高工作和学习效率

如何使用通义听悟提高工作和学习效率 通义听悟是一款利用人工智能技术&#xff0c;自动为音频和视频内容提供转写、翻译、总结、检索等功能的在线工具。它可以在会议、学习、访谈、培训等场景下&#xff0c;帮助您记录、阅读、整理、复习音视频信息&#xff0c;成为您的工作和…

深入浅出线程原理

Linux 中的线程本质 线程接口由 Native POSIX Thread Library 提供&#xff0c;即&#xff1a;NPTL 库函数 线程被称为轻量级进程 (Light Weight Process) 每一个线程在内核中都对应一个调度实体&#xff0c;拥有独立的结构体 (task_struct) 内核设计&#xff1a;一个进程对…

python + selenium 初步实现数据驱动

如果在进行自动化测试的时候将测试数据写在代码中&#xff0c;若测试数据有变&#xff0c;不利于数据的修改和维护。但可以尝试通过将测试数据放到excel文档中来实现测试数据的管理。 示例&#xff1a;本次涉及的项目使用的12306 selenium 重构------三层架构 excel文件数据如…

【RV1126 学习】SDK/ U-Boot/kernel/rootfs 编译学习

文章目录 RV1126芯片介绍rv1126 模块代码目录相关说明 SDK 包下的脚本使用build.sh 脚本使用envsetup.sh 脚本使用mkfirmware.sh 脚本使用rkflash.sh 脚本使用 U-Boot 编译和配置uboot 的配置修改编译操作 kernel 的修改编译rootfs 编译和配置buildroot 配置busybox 配置 RV112…

如何从电脑找回/恢复误删除的照片

按 Shift Delete 以后会后悔吗&#xff1f;想要恢复已删除的照片吗&#xff1f;好吧&#xff0c;如果是这样的话&#xff0c;那么您来对地方了。在本文中&#xff0c;我们将讨论如何从 PC 中检索已删除的文件。 自从摄影的概念被曝光以来&#xff0c;人们就对它着迷。早期的照…

SQL:一行中存在任一指标就显示出来

当想要统计的两个指标不在一张表中时&#xff0c;需要做关联。但很多情况下&#xff0c;也没有办法保证其中一张表的维度是全的&#xff0c;用left join或right join可能会导致数据丢失。所以借助full join处理。 如&#xff0c;将下面的数据处理成表格中的效果&#xff08;维…

IntersectionObserver

IntersectionObserver 这个API主要实现图片懒加载、加载更多等等。 该API作用是观察两个元素之间有没有交叉&#xff0c;有没有重叠 现在要做的是当图片跟视口有交叉的情况下&#xff0c;把data-src的图片路径替换给src属性 //第一个参数是 回调&#xff0c;第二个参数的 配置…

论文翻译 | 【深入挖掘Java技术】「底层原理专题」深入分析一下并发编程之父Doug Lea的纽约州立大学的ForkJoin框架的本质和原理

深入分析一下并发编程之父Doug Lea的纽约州立大学的ForkJoin框架的本质和原理这里写目录标题 前提介绍摘要引言设计性能优秀任务粒度合理Cilk框架和基础fork/join的可移植性FJTask框架设计思路线程映射关系拆分子任务排队及调度设置调度管理 标准示例 未完待续 前提介绍 Doug …

【linux驱动开发】在linux内核中注册一个杂项设备与字符设备以及内核传参的详细教程

文章目录 注册杂项设备驱动模块传参注册字符设备 开发环境&#xff1a; windows ubuntu18.04 迅为rk3568开发板 注册杂项设备 相较于字符设备&#xff0c;杂项设备有以下两个优点: 节省主设备号:杂项设备的主设备号固定为 10&#xff0c;在系统中注册多个 misc 设备驱动时&…

c++学习笔记-STL案例-机房预约系统2-创建身份类

前言 衔接上一篇“c学习笔记-STL案例-机房预约系统1-准备工作”&#xff0c;本文主要包括&#xff1a;创建身份类&#xff0c;建立了整个系统的框架&#xff0c;Identity基类&#xff0c;派生类&#xff1a;Sudent、Teacher、Manager&#xff0c;基类无实现源文件&#xff0c;…

旺店通·企业版和金蝶云星空接口打通对接实战

旺店通企业版和金蝶云星空接口打通对接实战 对接源平台:旺店通企业版 慧策&#xff08;原旺店通&#xff09;是一家技术驱动型智能零售服务商&#xff0c;基于云计算PaaS、SaaS模式&#xff0c;以一体化智能零售解决方案&#xff0c;帮助零售企业数字化智能化升级&#xff0c;实…

【python】matplotlib画图常用功能汇总

目录: 一、matplotlib画图风格二、matplotlib图像尺寸和保存分辨率三、matplotlib子图相关功能创建子图&#xff1a;绘制子图&#xff1a;设置子图属性&#xff1a;调整布局&#xff1a;示例代码&#xff1a; 四、matplotlib字体设置字体族和字体的区别字体选择和设置1. Matplo…

蓝桥杯单片机组备赛——数码管静态显示

文章目录 一、预备知识1.1 段选&位选1.2 静态显示和动态显示 二、原理图分析三、代码编写思路四、最终代码五、静态数码管显示练习与答案5.1 练习题目5.2 练习答案 一、预备知识 1.1 段选&位选 段选&#xff1a;段选指的是选择数码管哪个“段”应该被点亮。一般情况下…

py连接sqlserver数据库报错问题处理。20009

报错 pymssql模块连接sqlserver出现如下错误&#xff1a; pymssql._pymssql.OperationalError) (20009, bDB-Lib error message 20009, severity 9:\nUnable to connect: Adaptive Server is unavailable or does not exist (passwordlocalhost)\n) 解决办法&#xff1a; 打…

超声波清洗机洗眼镜有用吗?越贵的超声波清洗机洗的越干净吗?

首先&#xff01;作为一个眼镜党同时兼在眼镜店工作的人&#xff0c;用超声波清洗机洗眼镜可以说是非常高效的一种清洁方式&#xff0c;远比于我们手动清洗还要方便&#xff0c;现在市面上有非常多超声波清洗机的清洗技术是不太行的&#xff0c;所以大家在购买的时候还是需要多…

互联网资讯精选:科技爱好者周刊 | 开源日报 No.145

ruanyf/weekly Stars: 37.4k License: NOASSERTION 记录每周值得分享的科技内容&#xff0c;提供大量就业信息。欢迎投稿、推荐或自荐文章/软件/资源&#xff0c;并可通过多种方式进行搜索。 提供丰富的科技内容每周更新可以提交工作/实习岗位支持投稿和推荐功能 GyulyVGC/…

监督、半监督、无监督、自监督学习方法之间的区别

概念辨别 监督学习&#xff08;Supervised Learning&#xff09;&#xff1a;利用大量的标注数据来训练模型&#xff0c;模型最终学习到输入和输出标签之间的相关性&#xff1b;半监督学习&#xff08;Semi-supervised Learning&#xff09;&#xff1a;利用少量有标签的数据和…

行为驱动测试 python + behave

行为驱动&#xff0c;Behave-Driven Development&#xff0c;简称BDD。在行为驱动中运用结构化的自然语言描述场景测试&#xff0c;然后将这些结构化的自然语言转化为可执行的测试脚本或者其他形式。BDD的一种优势是&#xff0c;它建立了一种通用语言&#xff0c;而这种语言可以…