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

食品网站建设风格防静电产品东莞网站建设技术支持

食品网站建设风格,防静电产品东莞网站建设技术支持,做网站都需要买什么问题,Wordpress仿appstore1、题目描述: 给你一个按照非递减顺序排列的整数数组 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]

提示:

  • 0 <= nums.length <= 105
  • -109 <= nums[i] <= 109
  • nums 是一个非递减数组
  • -109 <= target <= 109

2、代码:

#include <vector>
using namespace std;class Solution {
public:vector<int> searchRange(vector<int>& nums, int target) {// 如果数组为空,直接返回 [-1, -1]if (nums.empty()) {return vector<int>{-1, -1};}// 调用辅助函数 findFirst 查找目标值的第一个位置int start = findFirst(nums, target);// 调用辅助函数 findLast 查找目标值的最后一个位置int end = findLast(nums, target);// 返回结果,包含起始位置和结束位置return vector<int>{start, end};}// 辅助函数:查找目标值的第一个位置int findFirst(vector<int>& nums, int target) {int l = 0, r = nums.size() - 1; // 定义左右边界int mid;// 开始二分查找while (l <= r) {mid = (l + r) / 2; // 计算中间值// 如果找到目标值if (target == nums[mid]) {// 检查是否是第一个出现的位置if (mid == 0 || nums[mid - 1] < target) {return mid; // 确保这是第一个位置,返回索引}// 如果不是第一个位置,继续向左搜索r = mid - 1;}// 如果目标值大于当前值,说明目标值在右侧,向右搜索else if (nums[mid] < target) {l = mid + 1;}// 如果目标值小于当前值,说明目标值在左侧,向左搜索else {r = mid - 1;}}// 如果循环结束仍未找到目标值,返回 -1return -1;}// 辅助函数:查找目标值的最后一个位置int findLast(vector<int>& nums, int target) {int l = 0, r = nums.size() - 1; // 定义左右边界int mid;// 开始二分查找while (l <= r) {mid = (l + r) / 2; // 计算中间值// 如果找到目标值if (target == nums[mid]) {// 检查是否是最后一个出现的位置if (mid == nums.size() - 1 || nums[mid + 1] > target) {return mid; // 确保这是最后一个位置,返回索引}// 如果不是最后一个位置,继续向右搜索l = mid + 1;}// 如果目标值大于当前值,说明目标值在右侧,向右搜索else if (nums[mid] < target) {l = mid + 1;}// 如果目标值小于当前值,说明目标值在左侧,向左搜索else {r = mid - 1;}}// 如果循环结束仍未找到目标值,返回 -1return -1;}
};

3、解题思路:

1. 核心思想

由于数组是有序的,可以利用二分查找的特性:

  • 起始位置 :目标值的第一个出现位置。
  • 结束位置 :目标值的最后一个出现位置。

为了满足时间复杂度 O(logn) 的要求,我们需要分别对这两个位置进行两次独立的二分查找。(也就是说,可以用借助2个辅助函数来实现两个位置的查找

2. 特殊情况处理

  • 空数组 :如果 nums.empty(),直接返回 [-1, -1]
  • 目标值不存在 :如果通过二分查找未找到目标值,返回 [-1, -1]

3. 具体步骤

第一步:查找起始位置
  1. 初始化左右边界 l = 0r = nums.size() - 1
  2. 使用二分查找:
    • 计算中间值 mid = (l + r) / 2
    • 如果 nums[mid] == target
      • 检查是否是第一个出现的位置(即 mid == 0nums[mid - 1] < target)。
      • 如果是,返回 mid
      • 如果不是,说明前面可能还有目标值,继续向左搜索,更新右边界 r = mid - 1
    • 如果 nums[mid] < target,说明目标值在右侧,更新左边界 l = mid + 1
    • 如果 nums[mid] > target,说明目标值在左侧,更新右边界 r = mid - 1
  3. 如果循环结束仍未找到目标值,返回 -1
第二步:查找结束位置
  1. 初始化左右边界 l = 0r = nums.size() - 1
  2. 使用二分查找:
    • 计算中间值 mid = (l + r) / 2
    • 如果 nums[mid] == target
      • 检查是否是最后一个出现的位置(即 mid == nums.size() - 1nums[mid + 1] > target)。
      • 如果是,返回 mid
      • 如果不是,说明后面可能还有目标值,继续向右搜索,更新左边界 l = mid + 1
    • 如果 nums[mid] < target,说明目标值在右侧,更新左边界 l = mid + 1
    • 如果 nums[mid] > target,说明目标值在左侧,更新右边界 r = mid - 1
  3. 如果循环结束仍未找到目标值,返回 -1

4. 时间与空间复杂度分析

  • 每次二分查找的时间复杂度为 O(logn)。
  • 分别查找起始位置和结束位置,总共进行了两次二分查找,总时间复杂度仍为 O(logn)。
  • 算法只使用了常量级别的额外空间(如变量 l, r, mid),因此空间复杂度为 O(1)。
http://www.dtcms.com/wzjs/797370.html

相关文章:

  • 做推广网站多少钱全网营销推广 好做吗
  • 网站优化排名软件推广品牌设计书籍
  • 深圳常平网站建设制作公司网站空间买卖
  • 只想怎样建设自己的销售网站商洛市城乡建设局网站
  • 如何网站切换房屋模拟装修软件
  • 哪个网站推广做的好保险网站推荐
  • 网站建设实施步骤深圳网站的优化公司哪家好
  • 做数模必逛的网站校园网门户网站建设
  • php p2p网站建设泰安九五兴昇网络科技
  • 高端网站建设公司怎么做推广网站建设公司违法
  • 珠海市建设工程交易网优化网站目录结构
  • 网站定制开发哪家做的好网站的收录
  • 云南做网站报价查看网站dns
  • 犀牛云做网站多少钱网站快照不更新了
  • 公司网站建设应注意哪些安徽一方建设招标网站
  • 深圳沙井做公司网站微网站模板怎么做
  • 网站专题二级页怎么做北京建网站需要多少钱
  • 扁平化设计风格网站wordpress地址和找点地址
  • 网站建设 服务内容微信怎么做网站推广
  • 湛江做网站seo的济南快速网站排名
  • 建设公司网站需要多少天寻找外贸客户的网站
  • 有哪些网站建设方案西安专业做网站的公司哪家好
  • 直播做ppt的网站邯郸手机网站建设费用
  • 一般建站需要多少钱网站设计公司圣辉友联
  • 荣成住房和城乡建设部网站甘肃省建设厅质量投诉网站
  • 建站之星网站建设下载版苏州市住房和城乡建设局网站首页
  • 人工智能公司网站建设爱企查官网
  • 东莞设计院东莞网站优化建设团队
  • 浮雕模东莞网站建设dede模板蓝色大气简洁企业网站模板
  • 网站锚点怎么用wordpress 统计流量