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

襄阳企业网站建设电脑零基础培训班

襄阳企业网站建设,电脑零基础培训班,织梦网站名称改不了,潍坊专业空心活塞杆本文目录 1 中文题目2 求解方法:左右边界二分查找2.1 方法思路2.2 Python代码2.3 复杂度分析 3 题目总结 1 中文题目 给定一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存…

本文目录

  • 1 中文题目
  • 2 求解方法:左右边界二分查找
    • 2.1 方法思路
    • 2.2 Python代码
    • 2.3 复杂度分析
  • 3 题目总结

1 中文题目

给定一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值 target,返回 [-1, -1]

必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。

示例:

输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]
输入:nums = [5,7,7,8,8,10], target = 6
输出:[-1,-1]
输入:nums = [], target = 0
输出:[-1,-1]

提示:

  • 0 ≤ n u m s . l e n g t h ≤ 1 0 5 0 \leq nums.length \leq10^5 0nums.length105
  • − 1 0 9 ≤ n u m s [ i ] ≤ 1 0 9 -10^9 \leq nums[i] \leq 10^9 109nums[i]109
  • nums 是一个非递减数组
  • − 1 0 9 ≤ t a r g e t ≤ 1 0 9 -10^9 \leq target \leq 10^9 109target109

2 求解方法:左右边界二分查找

2.1 方法思路

方法核心

  • 使用两次改进的二分查找
  • 分别查找目标值的左右边界
  • 通过不同的条件控制边界的移动

实现步骤

(1)查找左边界的过程:

  • 初始化左右指针,分别指向数组的开始和结束
  • 在循环中计算中间位置
  • 当找到大于或等于目标值的元素时,记录该位置并继续往左找
  • 当找到小于目标值的元素时,需要往右找
  • 最终找到第一个等于目标值的位置
  • 需要判断是否越界以及是否真的找到了目标值

(2)查找右边界的过程:

  • 同样初始化左右指针
  • 在循环中不断更新中间位置
  • 当找到小于或等于目标值的元素时,继续往右找
  • 当找到大于目标值的元素时,需要往左找
  • 最终找到最后一个等于目标值的位置
  • 同样需要进行边界检查

方法示例

输入:nums = [5,7,7,8,8,10], target = 8左边界查找过程:
1. 初始状态:left = 0, right = 5mid = 2, nums[mid] = 7 < targetleft = mid + 1 = 32. 第二次迭代:left = 3, right = 5mid = 4, nums[mid] = 8 == targetright = mid - 1 = 33. 第三次迭代:left = 3, right = 3mid = 3, nums[mid] = 8 == targetright = mid - 1 = 24. 循环结束:left = 3,找到左边界右边界查找过程:
1. 初始状态:left = 0, right = 5mid = 2, nums[mid] = 7 < targetleft = mid + 1 = 32. 第二次迭代:left = 3, right = 5mid = 4, nums[mid] = 8 == targetleft = mid + 1 = 53. 第三次迭代:left = 5, right = 5mid = 5, nums[mid] = 10 > targetright = mid - 1 = 44. 循环结束:right = 4,找到右边界返回:[3, 4]

2.2 Python代码

class Solution:def searchRange(self, nums: List[int], target: int) -> List[int]:def binary_search_left(nums, target):# 寻找左边界的二分查找left, right = 0, len(nums) - 1while left <= right:mid = left + (right - left) // 2# 如果中间值大于或等于目标值,继续往左找if nums[mid] >= target:right = mid - 1# 如果中间值小于目标值,往右找else:left = mid + 1# 判断是否找到目标值if left >= len(nums) or nums[left] != target:return -1return leftdef binary_search_right(nums, target):# 寻找右边界的二分查找left, right = 0, len(nums) - 1while left <= right:mid = left + (right - left) // 2# 如果中间值小于或等于目标值,继续往右找if nums[mid] <= target:left = mid + 1# 如果中间值大于目标值,往左找else:right = mid - 1# 判断是否找到目标值if right < 0 or nums[right] != target:return -1return right# 特殊情况处理if not nums:return [-1, -1]# 分别查找左右边界left_bound = binary_search_left(nums, target)right_bound = binary_search_right(nums, target)return [left_bound, right_bound]

2.3 复杂度分析

  • 时间复杂度:O(log n)
    • 两次二分查找
    • 每次二分查找的时间复杂度为O(log n)
  • 空间复杂度:O(1)
    • 只使用常数额外空间
    • 不随输入规模增长

3 题目总结

题目难度:中等
数据结构:数组
应用算法:左右边界二次二分查找

http://www.dt0577.cn/news/44968.html

相关文章:

  • 全网推广图片seo营销是什么
  • 注册一个新公司需要多少钱优化大师手机版下载安装app
  • 网站怎么添加横幅南昌seo排名外包
  • 聊天app开发需要多少钱网站关键词百度自然排名优化
  • 网站建设bd方案百中搜
  • 网站添加二级域名百度竞价代理公司
  • wordpress复制现在学seo课程多少钱
  • 山西公司网站建设网络推广费用
  • 犀牛云做网站怎么做网站排名优化快速
  • 学校网站建设先进个人荣誉百度快照的作用是什么
  • 王烨是哪个小说的主角辽阳网站seo
  • 10m网站空间网络事件营销案例
  • 建设银行常熟支行网站it培训机构学费一般多少
  • 上海宝山手机网站制作百度一下免费下载安装
  • 盗版小说网站怎么赚钱上海seo优化公司kinglink
  • 做商城网站要什么手续费百度广告联盟下载
  • 福州网站建设多少钱seo网站编辑优化招聘
  • 深圳宝安网站推广广州网络营销
  • 自学做网站要多久东营网站建设制作
  • 爱站网影视排行榜网站发帖推广平台
  • 自己做的网站不备案不能访问吗谷歌广告上海有限公司
  • 企业网站建设方案包含冯宗耀seo教程
  • 门户网站模板 html搜索引擎谷歌
  • 电子商务网站调研报告手机google官网注册账号入口
  • 电子商务网站系统建设进度安排seo81
  • 那个网站推作者公司宣传网页怎么做
  • 网站正能量免费推广软件晚上优化营商环境发言稿
  • 用php做的订票网站赛事资讯赛马资料
  • 临海网站制作网络营销成功案例3篇
  • 英文网站seo方案营销策略都有哪些方面