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

成都公司网站制作公司杭州百度seo优化

成都公司网站制作公司,杭州百度seo优化,做58同城那样的网站,一般网站建设多少钱LeetCode 热题 100 | 34. 在排序数组中查找元素的第一个和最后一个位置 大家好,今天我们来解决一道经典的算法题——在排序数组中查找元素的第一个和最后一个位置。这道题在 LeetCode 上被标记为中等难度,要求我们在一个按照非递减顺序排列的整数数组中…

LeetCode 热题 100 | 34. 在排序数组中查找元素的第一个和最后一个位置

大家好,今天我们来解决一道经典的算法题——在排序数组中查找元素的第一个和最后一个位置。这道题在 LeetCode 上被标记为中等难度,要求我们在一个按照非递减顺序排列的整数数组中找到目标值的开始位置和结束位置。如果数组中不存在目标值,返回 [-1, -1]。题目要求使用时间复杂度为 O(log n) 的算法。下面我将详细讲解解题思路,并附上 Python 代码实现。


问题描述

给定一个按照非递减顺序排列的整数数组 nums 和一个目标值 target,找出目标值在数组中的开始位置和结束位置。如果数组中不存在目标值,返回 [-1, -1]

示例 1:

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

示例 2:

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

示例 3:

输入:nums = [], target = 0
输出:[-1, -1]

解题思路

  1. 二分查找
    • 使用二分查找找到目标值的一个位置。
    • 从找到的位置开始,向左和向右扩展,找到目标值的起始位置和结束位置。

Python 代码实现

class Solution(object):def searchRange(self, nums, target):""":type nums: List[int]:type target: int:rtype: List[int]"""if not nums:return [-1, -1]left, right = 0, len(nums) - 1while left <= right:mid = (left + right) // 2if nums[mid] < target:left = mid + 1elif nums[mid] > target:right = mid - 1else:left = midbreakpos = leftif pos >= len(nums) or nums[pos] != target:return [-1, -1]left, right = 0, 0while (pos + right) < len(nums) and nums[pos + right] == target:right += 1while (pos - left) >= 0 and nums[pos - left] == target:left += 1return [pos - left + 1, pos + right - 1]# 测试示例
print(Solution().searchRange([5,7,7,8,8,10], 8))  # 输出: [3, 4]
print(Solution().searchRange([5,7,7,8,8,10], 6))  # 输出: [-1, -1]
print(Solution().searchRange([], 0))  # 输出: [-1, -1]

代码解析

  1. 检查空数组

    • 如果 nums 是空数组,直接返回 [-1, -1]
  2. 二分查找目标值

    • 使用二分查找找到目标值 target 的一个位置。
    • 如果 nums[mid] < target,说明目标值在右侧,移动左边界。
    • 如果 nums[mid] > target,说明目标值在左侧,移动右边界。
    • 如果找到目标值,将 left 设置为当前的 mid,并跳出循环。
  3. 验证目标值是否存在

    • 如果 pos 超出数组范围或 nums[pos] 不等于目标值,说明目标值不存在,返回 [-1, -1]
  4. 扩展目标值范围

    • 初始化两个变量 leftright,分别用于向左和向右扩展。
    • 向右扩展:从 pos 开始,逐步向右检查,直到找到不等于目标值的元素。
    • 向左扩展:从 pos 开始,逐步向左检查,直到找到不等于目标值的元素。
  5. 计算范围

    • 返回目标值的范围 [pos - left + 1, pos + right - 1]

复杂度分析

  • 时间复杂度:O(log n),其中 n 是数组的长度。二分查找的时间复杂度为 O(log n)。
  • 空间复杂度:O(1),只使用了常数个额外空间。

总结

通过二分查找找到目标值的一个位置,然后从该位置向左和向右扩展,可以高效地找到目标值的范围。这种方法不仅简洁,而且效率高,适合处理类似的问题。希望这篇题解对大家有所帮助,如果有任何问题,欢迎在评论区留言讨论!

关注我,获取更多算法题解和编程技巧!

http://www.cadmedia.cn/news/10261.html

相关文章:

  • 北京免费发布企业信息网站免费十八种禁用网站
  • 重庆app下载注册吉林关键词优化的方法
  • 一台服务做两个网站临沂百度seo
  • 简约网站建设seo在线优化网站
  • 大连网页制作wordpress优化推广网站seo
  • 网站建设的什么是网站建设的第一阶段百度推广最近怎么了
  • 政府网站建设调查免费可用的网站源码
  • 上海公上海公司网站建设网站运营及推广方案
  • 建设工程资讯哪个网站好北京网站制作设计
  • 毕设做网站具体步骤自媒体推广平台
  • 佛山建设网站东莞百度搜索网站排名
  • 西安分销商城网站建设sem竞价托管多少钱
  • 学校建设微网站的方案东莞今天发生的重大新闻
  • 崇信县人民政府网站东莞关键词排名seo
  • 兰州新区农投建设网站重庆百度seo代理
  • 保定建站软件网络营销的特点有哪些
  • 中通物流企业网站建设书电商网络推广
  • 网站上做推广方案网站优化检测工具
  • 舟山网站建设推广百度指数是干嘛的
  • 优狐网站建设百度贴吧免费发布信息
  • 提升了自己的网站全球搜
  • 天津建设银行招聘网站网络营销策划模板
  • 旅游网站建设的建议百度收录入口提交查询
  • 昆明网站seo诊断个人免费开发网站
  • 想做一个公司的网站去哪可以做营销网络的建设有哪些
  • 有没有专门做设计的网站seo关键词推广方式
  • 网站建设所需域名游戏推广对接平台
  • 丹阳火车站对面规划石家庄谷歌seo公司
  • 网站后台建设公司上海企业推广
  • p2p网上贷款网站建设方案hao123主页