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

网站底部导航制作北京网站建设公司华网天下优惠

网站底部导航制作,北京网站建设公司华网天下优惠,网站开始怎么做的,网络游戏名字题目给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。示例 1:…

题目

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

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

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

示例 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]

解析

问:如何理解 end = lowerBound(nums, target + 1) - 1 这段代码?

答:要想找到 ≤target 的最后一个数,无需单独再写一个二分。我们可以先找到这个数的右边相邻数字,也就是 >target 的第一个数。在所有数都是整数的前提下,>target 等价于 ≥target+1,这样就可以复用我们已经写好的二分函数了,即 lowerBound(nums, target + 1),算出这个数的下标后,将其减一,就得到 ≤target 的最后一个数的下标。

问:如果 ≥target+1 的第一个数不存在怎么办?

答:这说明数组中的数都 ≤target。如果数组中有 target,那么数组的最后一个数(下标 n−1)就是 target(因为数组是递增的)。同时,lowerBound(nums, target + 1) 在这种情况下会返回 n,减一得到 n−1,这正是我们要计算的下标。

问:为什么要写 left + (right - left) / 2?

答:在面试或者实际场景中,你不一定知道输入的数组有多长,万一数组长度达到 int 最大值,left + right 可能会发生加法溢出。当然,如果只看本题的数据范围,写 (left + right) / 2 也可以。对于 Python 来说,由于没有溢出这个概念,所以可以直接相加。

问:怎么判断我写的是哪一种二分?

答:看 while 循环的条件,如果是 left <= right,就是闭区间;如果是 left < right,就是半闭半开区间;如果是 left + 1 < right,就是开区间。

问:对于闭区间写法,为什么 nums[mid] >= target 的时候要写 right = mid - 1?此时的 mid 不是有可能是答案吗?这样写不会错过答案吗?

答:答案在区间外面,不在区间里面。如果觉得答案在区间里面的话,请思考这个问题:闭区间循环结束后 left>right,区间 [left,right] 是空的,什么也没有,难道答案在空区间里面吗?

问:我看到一种二分的写法,在二分的过程中,额外记录答案的值,你对此怎么看?

答:喜欢这种写法的同学,推荐写开区间二分,因为开区间二分 if 条件成立时更新的是哪个变量,最后返回的也就是哪个变量。这和记录答案的做法如出一辙。

问:关于开区间二分,如何理解 −1 和 n 这两个下标?

答:可以假设 nums[−1]=−∞ 以及 nums[n]=∞,此时 nums 仍然是有序的。在这种情况下,nums[−1]<target,所以 −1 是红色;nums[n]≥target,所以 n 是蓝色。

作者:灵茶山艾府
链接:https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array/solutions/1980196/er-fen-cha-zhao-zong-shi-xie-bu-dui-yi-g-t9l9/
来源:力扣(LeetCode)

答案

class Solution:# lower_bound 返回最小的满足 nums[i] >= target 的下标 i# 如果数组为空,或者所有数都 < target,则返回 len(nums)# 要求 nums 是非递减的,即 nums[i] <= nums[i + 1]def lower_bound(self, nums: List[int], target: int) -> int:left, right = -1, len(nums)  # 开区间 (left, right)while left + 1 < right:  # 区间不为空mid = (left + right) // 2# 循环不变量:# nums[left] < target# nums[right] >= targetif nums[mid] >= target:right = mid  # 范围缩小到 (left, mid)else:left = mid  # 范围缩小到 (mid, right)# 循环结束后 left+1 = right# 此时 nums[left] < target 而 nums[right] >= target# 所以 right 就是第一个 >= target 的元素下标return rightdef searchRange(self, nums: List[int], target: int) -> List[int]:start = self.lower_bound(nums, target)  # 选择其中一种写法即可if start == len(nums) or nums[start] != target:return [-1, -1]  # nums 中没有 target# 如果 start 存在,那么 end 必定存在end = self.lower_bound(nums, target + 1) - 1return [start, end]# 作者:灵茶山艾府
# 链接:https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array/solutions/1980196/er-fen-cha-zhao-zong-shi-xie-bu-dui-yi-g-t9l9/
# 来源:力扣(LeetCode)

复杂度分析

时间复杂度:O(logn),其中 n 为 nums 的长度。

空间复杂度:O(1),仅用到若干额外变量。

http://www.dtcms.com/a/543339.html

相关文章:

  • 建网站需要数据库吗如何做自助搜券网站
  • 金环建设集团网站免费建站软件哪个最好
  • 企业如何 建设好自己的网站宜昌有做网站的公司吗
  • 海口网站建设哪家最好个人网页制作模板下载
  • 图片版小说网站源码app制作开发公司收费
  • 优秀公司网站苏州网站制作工作室
  • 外贸企业商城网站建设网站建设业务怎么做
  • 有无广告销售版本"有广告免费无广告收费"网站python电影天堂源码
  • 免费制作的企业网站凡科建站官网地址
  • 网站的基本功能四川德立胜建设工程有限公司网站
  • 网站响应速度验收做外贸有哪些好的网站
  • 广州海珠区网站建设百度下载安装2019
  • 网站开发合同 黑客攻击条款潍坊网站建设培训班
  • 网站开发兼职图文识别小程序是什么
  • 淘气堡网站建设温岭市市住房和城乡建设规划局网站
  • 黄金网站软件app视频镇江大港信息港
  • 在唐山做网站多少钱赣州营销型网站策划
  • 销售珍珠网站建设策划书市场调研公司存在的意义
  • 咸宁网站设计制作atheme wordpress
  • 大气自适应网站源码互联网推广模式有哪些
  • 网站需要具备条件推广seo优化公司
  • 营销型网站的盈利模式网站建设制作专业开发定制
  • 修邦建设网站潍坊市建设工程交易中心网站
  • 免费的企业网站cms公司调查公司
  • 公司网站实用性wordpress相册展示
  • 电子商务网站建设 以为例怎么做网站推广线下
  • 企业网站建设的一般要素包括什么android毕业设计代做网站
  • 网站怎么添加导航栏wordpress 自定义功能
  • 迁安做网站购物网站建设报价表
  • 手机制作最简单钓鱼网站企业网站建设珠海