力扣刷题练习 七【34. 在排序数组中查找元素的第一个和最后一个位置】

前言

数组类型题目练习。
练习题 七【34. 在排序数组中查找元素的第一个和最后一个位置】


一、题目阅读

给你一个按照非递减顺序排列的整数数组 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

二、尝试实现

思路

  • 理解题目:nums从小到大,已经排好顺序;第一个问题:找target在不在?第二个问题:返回target下标的开始和结束。
  • 直观:用遍历nums一遍,但是时间复杂度O(n)。题目不让用。pass
  • 找一个元素在不在集合里?可以想到哈希法。可是选择什么结构?用数组,还是要遍历nums,只是统计次数;用无序的unordered_set或者map,感觉都不好用,放次数还是放下标?还是得遍历nums,时间复杂度没降低。
  • 二分查找:因为nums排好序,可以直接用。如果找到target,逐步缩小区间,就可以确定位置。nice。时间复杂度是O(log n)。

代码实现

测试通过。

class Solution {
public:vector<int> searchRange(vector<int>& nums, int target) {vector<int> result;int left = 0;int right = nums.size()-1;while(left <= right){int middle = (left + right)/2;if(nums[middle] < target){left = middle + 1;}else if(nums[middle] > target){right = middle -1;}else if(nums[middle] == target){while(nums[left] < target){left++;}while(nums[right] > target){right--;}result.push_back(left);result.push_back(right);break;}}if(result.empty()){result = {-1,-1};}return result;}
};

三、参考答案

参考答案链接

学习内容

(1)左右边界分别来找,也是用二分法,可是在找边界的时候什么时候动left和right,有点绕还是。
(2)找右边界:

  • 如果middle的值比target大,肯定在[left,middle-1]之间,所以只把right = middle-1;
  • 若middle的值小于等于target,肯定在[middle+1,right]之间,所以left = middle+1;还要rightboard = left;
  • 为什么rightboard在else条件下还要始终跟着left走?如果不走,会怎么样?最后直接return left?

(3)找左边界:

  • 如果middle的值比target大,肯定在[left,middle-1]之间,所以只把right = middle-1;
  • 若middle的值小于等于target,肯定在[middle+1,right]之间,所以left = middle+1;还要rightboard = left;
  • 为什么leftboard在else条件下还要始终跟着right走?如果不走,会怎么样?最后直接return right?

总结

选择个人方法:使用二分查找,如果找到target,就逐步缩小两端。
参考思路:还需要去注意,找右边界是小于等于调整;找左边界是大于等于调整。不如个人方法。

(欢迎指正,转载标明出处)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/867648.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

A Threat Actors 出售 18 万名 Shopify 用户信息

BreachForums 论坛成员最近发布了涉及 Shopify 的重大数据泄露事件。 据报道&#xff0c;属于近 180,000 名用户的敏感数据遭到泄露。 Shopify Inc. 是一家总部位于安大略省渥太华的加拿大公司。 开发和营销同名电子商务平台、Shopify POS 销售点系统以及专用于企业的营销工…

SQL脚本初始化数据

创建或选择某个数据库&#xff0c;运行窗口输入&#xff1a;source,再拖入文件&#xff0c;回车即可&#xff1b; 虽然也可以使用图形化工具初始化数据&#xff0c;但是他会有内存限制&#xff0c;也就是较大的sql文件不可以初始化&#xff0c;而运行窗口没有sql文件大小限制&…

本周23个Github有趣项目llama-agents等

23个Github有趣的项目、工具和库 1、Positron 下一代数据科学 IDE。 您使用 VS Code 进行数据科学&#xff08;Python 或 R&#xff09;&#xff0c;但希望它包含专用控制台、变量窗格、数据浏览器和其他用于特定数据工作的功能。您使用 Jupyterlab 进行数据科学&#xff08;…

python读取csv出错怎么解决

Python用pandas的read_csv函数读取csv文件。 首先&#xff0c;导入pandas包后&#xff0c;直接用read_csv函数读取报错OSError&#xff0c;如下&#xff1a; 解决方案是加上参数&#xff1a;enginepython。 运行之后没有报错&#xff0c;正在我欣喜之余&#xff0c;输出一下d…

数据结构第04节:数组

线性数据结构 - 数组 线性数据结构中的数组是一种基础且广泛使用的数据存储方式&#xff0c;它存储一系列相同类型的元素&#xff0c;这些元素在内存中连续存放。数组可以是静态的或动态的。 静态数组&#xff08;Static Arrays&#xff09; 静态数组在声明时需要指定大小&a…

如何度量信息的大小

信息这个词让我们感到熟悉而又陌生。熟悉是因为我们所处在一个信息时代&#xff0c;与生活密切相关的就有大量的各种信息&#xff0c;比如书籍、手机、电脑等。而陌生是因为很难精确说明信息是什么并且如何量化信息&#xff0c;比如“地球是圆的”一句话包含了多少信息呢&#…

Java:多态

文章目录 一、概念二、使用前提三、实例四、优缺点4.1 优点4.2 缺点 五、动态绑定和静态绑定5.1 动态绑定5.2 静态绑定 一、概念 多态是指类的多种形态&#xff0c;同一个接口&#xff0c;使用不同的实例而执行不同操作。 二、使用前提 有继承/实现关系有父类引用指向子类对象…

centos7部署mysql8.0

1.安装MySQL的话会和MariaDB的文件冲突&#xff0c;所以需要先卸载掉MariaDB。查看是否安装mariadb rpm -qa | grep mariadb 2. 卸载mariadb rpm -e --nodeps 查看到的文件名 3.下载MySQL安装包 MySQL官网下载地址: MySQL :: Download MySQL Community Serverhttps://dev.mys…

19.JWT

1►JWT博客推荐 阮老师讲得很好了&#xff0c;网址如下&#xff1a; http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html 2►ry是怎么践行JWT的呢&#xff1f; 问题一&#xff1a;不登录的时候有token吗&#xff1f; 答&#xff1a;没有&#xff0c;所…

[概念]探索AI与AIGC:从定义到应用场景

一、什么是人工智能&#xff08;AI&#xff09;&#xff1f; 人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;正成为科技革命和产业变革的核心推动力。AI是研究、开发用于模拟、延伸和扩展人类智能的理论、方法、技术及应用系统的新兴技术科学&#xf…

Uniapp的简要开发流程指南

Uniapp开发指南 简介 Uniapp 是由DCloud推出的一款基于Vue.js的多端开发框架&#xff0c;支持编译到iOS、Android、H5、以及各大小程序平台&#xff08;如微信小程序、支付宝小程序、百度小程序等&#xff09;。它使开发者可以通过一次编码&#xff0c;实现跨平台的应用发布&…

blender 纹理绘制-贴花方式

贴画绘制-1分钟blender_哔哩哔哩_bilibili小鸡老师的【Blender风格化角色入门教程】偏重雕刻建模https://www.cctalk.com/m/group/90420100小鸡老师最新的【风格化角色全流程进阶教程】偏重绑定。早鸟价进行中&#xff01;欢迎试听https://www.cctalk.com/m/group/90698829, 视…

[C++][CMake][嵌套的CMake]详细讲解

目录 0.前言 & 准备1.节点关系2.添加子目录3.解决问题1.根目录2.calc目录3.sort目录4.calc_test目录5.sort_test 4.注意 0.前言 & 准备 如果项目很大&#xff0c;或者项目中有很多的源码目录&#xff0c;在通过CMake管理项目的时候如果只使用一个CMakeLists.txt&#…

Splunk Enterprise 中的严重漏洞允许远程执行代码

Splunk 是搜索、监控和分析机器生成大数据的软件领先提供商&#xff0c;为其旗舰产品 Splunk Enterprise 发布了紧急安全更新。 这些更新解决了几个构成重大安全风险的关键漏洞&#xff0c;包括远程代码执行 (RCE) 的可能性。 受影响的版本包括 * 9.0.x、9.1.x 和 9.2.x&…

ARM架构和Intel x86架构

文章目录 1. 处理器架构 2. ARM架构 3. Intel x86架构 4. 架构对比 1. 处理器架构 处理器架构是指计算机处理器的设计和组织方式&#xff0c;它决定了处理器的性能、功耗和功能特性。处理器架构影响着从计算机系统的硬件设计到软件开发的各个方面。在现代计算技术中&#…

论如何搭建属于自己的服务器?

在现如今的数字化时代中&#xff0c;为了能够搭建网站和运行应用程序&#xff0c;很多人选择搭建属于自己的服务器&#xff0c;下面我们就来了解一下如何搭建服务器吧&#xff01; 搭建服务器我们首先需要选择适合自身需求的硬件设备&#xff0c;其中包含内存、CPU和存储等配置…

计算机组成原理学习笔记(一)

计算机组成原理 [类型:: [[计算机基础课程]] ] [来源:: [[B站]] ] [主讲人:: [[咸鱼学长]] ] [评价:: ] [知识点:: [[系统软件]] & [[应用软件]] ] [简单解释:: 管理计算机系统的软件&#xff1b; 按照任务需要编写的程序 ] [问题:: ] [知识点:: [[机器字长]] ] [简单…

广告联盟小游戏app开发搭建看广告收益项目

以下是关于广告联盟小游戏 APP 开发搭建看广告收益项目的一般步骤和要点&#xff1a; 项目规划 明确游戏的类型、玩法和目标受众。确定通过广告获取收益的模式和策略。 技术选型 选择适合的开发框架和技术栈&#xff0c;如移动开发框架&#xff08;如 React Native、Flutter 等…

第6篇 共识机制深度解析:PoW、PoS、DPoS和PBFT

在区块链的世界里,有一个非常重要的概念叫做“共识机制”。它就像是区块链的心脏,保证大家在这条链上的信息是可靠的、不可篡改的。今天,我们就来通俗易懂地聊聊区块链里的四大共识机制:工作量证明(PoW)、权益证明(PoS)、委托权益证明(DPoS)和拜占庭容错(PBFT)。为…

绝区壹--LLM的构建模块

前言 语言是人类交流的本质&#xff0c;大型语言模型 (LLM) 凭借其出色的理解和生成类似人类的文本的能力&#xff0c;彻底改变了我们与语言互动和利用语言的方式。深入研究 LLM 的构建块&#xff08;向量、标记和嵌入&#xff09;&#xff0c;揭示了使这些模型能够以前所未有…