当前位置: 首页 > news >正文

力扣刷题Day 70:在排序数组中查找元素的第一个和最后一个位置(34)

1.题目描述

2.思路

方法1(自己写的):一次二分查找找到等于target的一个元素索引axis,然后向左右延伸找边界。

方法2(灵茶山艾府佬的闭区间二分查找写法):定义一个lower_bound()函数找到第一个大于等于某数的元素索引,分别对target和(target + 1)调用lower_bound()函数即可。

方法3(对方法2的自主延伸):两次二分查找,分别找小于等于(target - 1)的元素索引以及大于等于(target + 1)的元素索引。

3.代码(Python3)

方法1:

class Solution:def searchRange(self, nums: List[int], target: int) -> List[int]:left, right = 0, len(nums) - 1axis = -1while left <= right:mid = (left + right) // 2if target < nums[left] or target > nums[right]: breakelif nums[mid] < target < nums[right]: left = mid + 1elif nums[left] < target < nums[mid]: right = mid - 1else:if target == nums[left]: axis = leftelif target == nums[right]: axis = rightelse: axis = midbreakif axis == -1: return [-1, -1]left_bound, right_bound = axis, axislb_found, rb_found = False, Falsewhile not lb_found or not rb_found:if not lb_found:if left_bound == 0 or nums[left_bound - 1] != target: lb_found = Trueelse: left_bound -= 1if not rb_found:if right_bound == len(nums) - 1 or nums[right_bound + 1] != target: rb_found = Trueelse: right_bound += 1return [left_bound, right_bound]

方法2:

class Solution:def searchRange(self, nums: List[int], target: int) -> List[int]:def lower_bound(target_num):left, right = 0, len(nums) - 1while left <= right:mid = (left + right) // 2if nums[mid] >= target_num: right = mid - 1else: left = mid + 1return leftstart = lower_bound(target)if start == len(nums) or nums[start] != target: return [-1, -1]end = lower_bound(target + 1) - 1return [start, end]

方法3:

class Solution:def searchRange(self, nums: List[int], target: int) -> List[int]:def lower_bound(target_num):left, right = 0, len(nums) - 1while left <= right:mid = (left + right) // 2if nums[mid] >= target_num: right = mid - 1else: left = mid + 1return leftdef higher_bound(target_num):left, right = 0, len(nums) - 1while left <= right:mid = (left + right) // 2if nums[mid] <= target_num: left = mid + 1else: right = mid - 1 return rightstart = lower_bound(target)if start == len(nums) or nums[start] != target: return [-1, -1]end = higher_bound(target)return [start, end]

4.执行情况

方法1:

方法2:

方法3:

5.感想

其实方法3完全就是多此一举,是非常没有必要的。灵神的方法也太妙了。

http://www.lqws.cn/news/119935.html

相关文章:

  • 如何借助Hyper - V在Windows 10中构建安全软件测试环境
  • parquet :开源的列式存储文件格式
  • [蓝桥杯]密文搜索
  • ios版本的Tiktok二次安装不上,提示:Unable to Install “TikTok”
  • AI 时代下语音与视频伪造的网络安全危机
  • vue-16(Vuex 中的模块)
  • Python 中 Django 中间件:原理、方法与实战应用
  • stm32——UART和USART
  • Mac/iOS 如何解压 RAR 格式压缩包:常用工具与详细操作步骤
  • [Java 基础]抽象类和接口
  • SSM spring Bean基础配置
  • C++课设:银行账户管理系统
  • SAP学习笔记 - 开发22 - 前端Fiori开发 数据绑定(Jason),Data Types(数据类型)
  • VSCode 工作区配置文件通用模板(CMake + Ninja + MinGW/GCC 编译器 的 C++ 或 Qt 项目)
  • 【免费数据】1980-2022年中国2384个站点的水质数据
  • Monorepo架构: 项目管理模式对比与考量
  • 学习笔记(23): 机器学习之数据预处理Pandas和转换成张量格式[1]
  • Java设计模式深度解析:策略模式的核心原理与实战应用
  • 网页前端开发(基础进阶3--Vue)
  • 机器学习简介
  • Asp.Net Core基于StackExchange Redis 缓存
  • Flutter、React Native 项目如何搞定 iOS 上架?从构建 IPA 到上传 App Store 的实战流程全解析
  • 【unity游戏开发入门到精通——通用篇】从零掌握UnityWebRequest:文件下载、表单提交、超时处理、断点续传
  • 【发布实录】云原生+AI,助力企业全球化业务创新
  • [特殊字符] 在 React Native 项目中封装 App Icon 一键设置命令(支持参数与默认路径)
  • go语言学习 第5章:函数
  • 电气架构/域控制器/中央计算平台技术论坛
  • React Native开发鸿蒙运动健康类应用的项目实践记录
  • 应用层协议:HTTP
  • 结构性设计模式之Facade(外观)设计模式