Leetcode34. 在排序数组中查找元素的第一个和最后一个位置

Shopee前端反爬三要素:x-sap-Ri、x-sap-Sec与af-ac-enc-dat深度解析 电商前端反爬机制本质是运行时环境可信验证,其核心在于动态生成的请求指纹、会话签名与行为加密载荷。这类机制不依赖静态Token,而是基于浏览器真实交互(如鼠标轨迹、页面可见性、时间精度)实时计算,体现JS运行时环境不可模拟性。技术价值在于将风控前移至客户端,大幅提升自动化绕过成本;典型应用场景包括商品价格监控、竞品数据采集与合规爬虫开发。本文聚焦Shopee实战案例,深入拆解x-sap-Ri(设备+行为哈希指纹)、x-sap-Sec(动态密钥签名)及af-ac-enc-dat(AES加密行为载荷)三大字段的生 阅读详情

Every day a Leetcode

题目来源:34. 在排序数组中查找元素的第一个和最后一个位置

解法1:二分查找

直观的思路肯定是从前往后遍历一遍。用两个变量记录第一次和最后一次遇见 target 的下标,但这个方法的时间复杂度为 O(n),没有利用到数组升序排列的条件。

由于数组已经排序,因此整个数组是单调递增的,我们可以利用二分法来加速查找的过程。

这道题可以看作是自己实现 C++ 里的 lower_bound 和 upper_bound 函数。

这里我们尝试使用左闭右开的写法,当然左闭右闭也可以。

代码:

/*
 * @lc app=leetcode.cn id=34 lang=cpp
 *
 * [34] 在排序数组中查找元素的第一个和最后一个位置
 */

// @lc code=start
class Solution
{
private:
    // 辅函数
    int lower_bound(vector<int> &nums, int target)
    {
        int n = nums.size();
        int left = 0, right = n;
        while (left < right)
        {
            int mid = left + (right - left) / 2;
            if (nums[mid] >= target)
                right = mid;
            else
                left = mid + 1;
        }
        return left;
    }
    // 辅函数
    int upper_bound(vector<int> &nums, int target)
    {
        int n = nums.size();
        int left = 0, right = n;
        while (left < right)
        {
            int mid = left + (right - left) / 2;
            if (nums[mid] > target)
                right = mid;
            else
                left = mid + 1;
        }
        return left;
    }

public:
    // 主函数
    vector<int> searchRange(vector<int> &nums, int target)
    {
        if (nums.empty())
            return vector<int>{-1, -1};
        int lower = lower_bound(nums, target);
        int upper = upper_bound(nums, target) - 1; // 这里需要减1位
        if (lower == nums.size() || nums[lower] != target)
            return vector<int>{-1, -1};
        return vector<int>{lower, upper};
    }
};
// @lc code=end

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(logn) ,其中 n 为数组的长度。二分查找的时间复杂度为 O(logn),一共会执行两次,因此总时间复杂度为 O(logn)。

空间复杂度:O(1) 。只需要常数空间存放若干变量。

拓展:二分查找的 3 种写法

2024.1.31 更新。

左闭右闭区间

int lower_bound(vector<int> &nums, int target)
{
	int n = nums.size();
	int left = 0, right = n - 1;
	while (left <= right)
	{
		int mid = left + (right - left) / 2;
		if (nums[mid] >= target)
			right = mid - 1;
		else
			left = mid + 1;
	}
	return left;
}

左闭右开区间

int lower_bound(vector<int> &nums, int target)
{
	int n = nums.size();
	int left = 0, right = n;
	while (left < right)
	{
		int mid = left + (right - left) / 2;
		if (nums[mid] >= target)
			right = mid;
		else
			left = mid + 1;
	}
	return left; // right 也行
}

左开右开区间

int lower_bound(vector<int> &nums, int target)
{
	int n = nums.size();
	int left = -1, right = n;
	while (left + 1 < right)
	{
		int mid = left + (right - left) / 2;
		if (nums[mid] < target)
			left = mid;
		else
			right = mid;
	}
	return right;
}
海思3516A移植MT7601U编译过程记录 官方地址:https://www.mediatek.com/products/broadbandWifi/mt7601 tar -xjf DPO_MT7601U_LinuxSTA_3.0.0.4_20130913.tar.bz2 cd DPO_MT7601U_LinuxSTA_3.0.0.4_20130913 1> Makefile替换 PLATFORM = HISI_3516A ifeq ($(PLATFORM),HISI_3516A) LINUX_SRC = /home/wbk/test/linu 阅读详情

相关推荐

【kubeEdge】离线部署

根据k8s的这个规则,可以将节点通过 label 的方式进行分组,比如将某几个节点都打上标签为 name=edge,当调度应用到 edge 节点时,会找到 label 为 edge 的所有节点,根据设置的副本数,将应用启动起来,如果设置的副本数超过了设置 edge 标签的节点数,则多出的将会显示 pending 状态,从而无法启动。清除 keadm init 或 keadm join 造成的影响均可使用 keadm reset,这个操作会删除 /etc/kubeedge 下的文件,如有需要请提前备份。

qq_42944740的博客 1717

Leetcode 34. 在排序数组中查找元素的第一个和最后一个位置 【数组 二分查找】

Leetcode 34. 在排序数组中查找元素的第一个和最后一个位置 【数组 二分查找】

Bitdancing的专栏 4004

Windows Server 2022域控环境下的MDT部署工具安装与配置避坑指南

本文详细介绍了在Windows Server 2022域控环境中安装和配置MDT(Microsoft Deployment Toolkit)的全流程,包括ADK与Windows PE的精准安装、MDT高级配置、部署工作流构建及性能优化技巧。通过实战指南帮助IT管理员实现自动化系统部署,提升企业IT运维效率,特别适用于需要静默下发系统的大规模部署场景。

weixin_28481133的博客 439

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

这篇文章介绍了在排序数组中查找目标值起始和结束位置的二分查找算法。主要内容包括: 查找左边界时使用向下取整的中值计算,通过right=mid保留可能的左边界 查找右边界时使用向上取整的中值计算,通过left=mid保留可能的右边界 关键点说明:循环条件使用left<right避免死循环,查找左右边界时采用不同的中值计算方式 常见错误分析:展示了可能导致边界遗漏或死循环的错误写法 算法正确性验证:以[5,7,7,8,8,10]为例,详细演示了查找target=8的执行过程 比较了不同中值计算方式对算法性

2402_83315537的博客 1629

思科—OSPF多区域配置实验

实验目的:配置OSPF多区域,使得不同网段的PC互相ping通。 网络拓扑如下: R0的配置 Router>en Router#conf t Router(config)#int g0/1 Router(config-if)#ip add 192.168.1.1 255.255.255.0 Router(config-if)#no shut Router(config-if)#exit Router(config)#int g0/0 Router(config-if)#ip add 192.168.

m0_46237205的博客 1万+

HDI盲埋孔设计规范:高速PCB信号完整性落地指南

盲埋孔是高密度互连(HDI)PCB实现高速信号完整性的关键技术,其本质是通过控制过孔stub长度、优化回流路径和提升布线密度,解决GHz级信号在传统通孔结构下出现的谐振、串扰与EMI超标问题。其设计核心在于叠层物理约束、电气参数建模与工艺能力协同,涉及stub长度计算、反焊盘尺寸推导、孔壁粗糙度Rz控制等关键指标。广泛应用于DDR4、PCIe Gen4、USB3.2等高速接口的PCB设计中,尤其在车载ADAS、5G基站及FPGA载板等对SI/PI要求严苛的场景中成为刚性门槛。

weixin_34416754的博客 438

Leetcode 34. 在排序数组中查找元素的第一个和最后一个位置

Leetcode 34. 在排序数组中查找元素的第一个和最后一个位置1、问题分析2、问题解决3、总结 1、问题分析 题目链接:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/   本质上就是一个二分查找问题。代码我已经进行了详细的注释,理解应该没有问题,读者可以作为参考,如果看不懂(可以多看几遍),欢迎留言哦!我看到会解答一下。 2、问题解决   笔者以C++方式解决。 #inc

珍惜 7778

Windows 10/11 零基础配置 SillyTavern 连接 Claude API 完整指南(含 Node.js 环境搭建)

本文提供Windows 10/11系统下零基础配置SillyTavern连接Claude API的完整教程,涵盖Node.js环境搭建、SillyTavern初始化及API连接配置等关键步骤。通过详细的操作指南和实用技巧,帮助用户快速搭建AI聊天界面并优化对话体验,实现与Claude AI的高效交互。

weixin_30642561的博客 134

【力扣LeetCode】34 在排序数组中查找元素的第一个和最后一个位置

题目描述(难度中) 给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。 你的算法时间复杂度必须是 O(log n) 级别。 如果数组中不存在目标值,返回 [-1, -1]。 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: [3,4] 示例 2: 输入: nums = [5,7,7,8,8...

Jiewang的博客 247

求无向图中所有的环 C++ python

求无向图中所有的环

random_repick的专栏 1152

第十二天:Python字典(Dict)详解

字典(Dictionary)是Python中最强大的数据类型之一,它是一种可变的、无序的键值对(key-value)集合。字典中的元素是通过键(key)来存取的,而不是通过偏移量(如列表中的索引)。 字典的核心特性包括: 键值对结构:每个元素由一个键和一个值组成,中间用冒号(:)分隔 无序性:字典中的元素没有固定的顺序(Python 3.7+版本中字典会保持插入顺序,但不应依赖此特性进行顺序操作) 可变性:可以动态地添加、修改或删除键值对 键的唯一性:字典中的键必须是唯一的,如果重复,后面的键值对会覆盖

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1681

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

LeetCode 34 在排序数组中查找元素的第一个和最后一个位置题目描述思路代码 题目描述 给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。 你的算法时间复杂度必须是 O(log n) 级别。 如果数组中不存在目标值,返回 [-1, -1]。 思路 思路非常简单,就是单纯的二分查找,如果在数组中找到一个数和目标数相同,就在此位置向...

weixin_37905795的博客 220

UGUI合批杀手:Mask/RectMask2D为何必断合批?

颜色缓冲负责记录像素颜色;模板缓冲负责记录“这个像素的模板值”(一个小整数);渲染时,你可以设定:只有模板值为 X 的地方才允许画;或者往某些区域写特定的模板值。类似于:先拿一支隐形笔在纸上画出一块区域,给它记一个编号“1”,后面的涂色动作只允许涂在“编号为1”的区域上。合批的前提:渲染状态不变,连续元素能一口气画完。材质、贴图、混合模式、Stencil、裁剪区域……都得一致。Mask / RectMask2D 的本质:在渲染状态上加规则——“只在某个区域内允许写像素”。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 123

LeetCode 力扣 34. 在排序数组中查找元素的第一个和最后一个位置

题目描述(中等难度) 找到目标值的第一次出现和最后一次出现的位置,同样要求 log ( n ) 下完成。 先分享 leetcode 提供的两个解法。 解法一 线性扫描 从左向右遍历,一旦出现等于 target 的值就结束,保存当前下标。如果从左到右没有找到 target,那么就直接返回 [ -1 , -1 ] 就可以了,因为从左到右没找到,那么从右到左也一定不会找到的。如果找到了,然后再从右到左...

wind_liang的博客 1275

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

leetcode力扣 34题 在排序数组中查找元素的第一个和最后一个位置

题目: 给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。 你的算法时间复杂度必须是 O(log n) 级别。 如果数组中不存在目标值,返回 [-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] 第一个出现的位置: 左边不是target右边是target。 最

LifeGoesOn 421

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

LeetCode第 34 题:在排序数组中查找元素的第一个和最后一个位置(C++)

34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode) 就是二分查找的变体,感觉跟简单题差不多: 数据结构与算法之美:16 | 二分查找(下) 这儿怎么找都行,那就找第一个等于target的位置吧: class Solution { public: int bsearch(vector<int> &nums, int low, int high, int target){ while(low <= high){

zj 283

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

leetcode34---在排序数组中查找元素的第一个和最后一个位置

leetcode34—在排序数组中查找元素的第一个和最后一个位置 题意简述 给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。 你的算法时间复杂度必须是 O(log n) 级别。 如果数组中不存在目标值,返回 [-1, -1]。 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: [3,...

Again的博客 267

34.在排序数组中查找元素的第一个和最后一个位置(力扣LeetCode)

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

m0_73841621的博客 671

Leetcode 34 在排序数组中查找元素的第一个和最后一个位置

Leetcode 34 在排序数组中查找元素的第一个和最后一个位置 //给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。 // // 你的算法时间复杂度必须是 O(log n) 级别。 // // 如果数组中不存在目标值,返回 [-1, -1]。 // // 示例 1: // // 输入: nums = [5,7,7,8,8,10], target = 8 //输出: [3,4] // // 示例 2: // // 输入: nums = [

weixin_44575373的博客 167

【力扣】LeetCode34. 在排序数组中查找元素的第一个和最后一个位置

给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。 你的算法时间复杂度必须是 O(log n) 级别。 如果数组中不存在目标值,返回 [-1, -1]。 /** * Note: The returned array must be malloced, assume caller calls free(). */ int* se...

金金金金金的博客 226

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

LeetCode 34在排序数组中查找元素的第一个和最后一个位置 题目简述:给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。 输入:nums = [5,7,7,8,8,10], target = 8 输出:[3,4] 输入:nums = [5,7,7,8,8,10], target = 6 输出:[-1,-1...

XBlog 250

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

题目要求在排序数组中查找目标值的起始和结束位置,若不存在则返回[-1, -1]。三种解法均基于二分查找找下界的思想:通过查找target的下界确定起始位置,查找target+1的下界确定结束位置。解法差异主要体现在循环条件和边界处理上:解法一使用经典二分循环条件l<=r,解法二改为l<r,解法三采用开区间处理l+1<r。三种方法的时间复杂度均为O(log n),解法二和解法三在边界处理上更简洁直观。

大家好,我是千楼,全栈开发工程师,分享日常学习和工作,记录成长~~~ 1083

leetcode(Array)--34 在排序数组中查找元素的第一个和最后一个位置

leetcode(Array)–34 在排序数组中查找元素的第一个和最后一个位置 1,题目: 2,思路: (1)、利用二分法,先找到中间值mid对应的值,若nums[mid] == target,则利用循环向左和向右找出最左的target和最右的target (2),若nums[mid]!=target,则target的值不是在左边数组里就是在右边的数组里,再用if条件找出最左和最右的targ...

chen772209的博客 167

LeetCode 34 在排序数组中查找元素的第一个和最后一个位置(java实现)

LeetCode 34 在排序数组中查找元素的第一个和最后一个位置 给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。 你的算法时间复杂度必须是 O(log n) 级别。 如果数组中不存在目标值,返回 [-1, -1]。 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: [3,4] 示例...

大白菜的博客 390

力扣 LeetCode 34. 在排序数组中查找元素的第一个和最后一个位置

有序数列很容易就想到使用二分查找,分两次查找,一次从左向右查找第一个值,一次从右向左找最后一个值。 class Solution { public: vector<int> searchRange(vector<int>& nums, int target) { int len =nums.size(); if(len ==0) { return {-1,-1}; ..

weixin_43304992的博客 190

golang力扣leetcode 34.在排序数组中查找元素的第一个和最后一个位置

34.在排序数组中查找元素的第一个和最后一个位置34.在排序数组中查找元素的第一个和最后一个位置题解代码 34.在排序数组中查找元素的第一个和最后一个位置 34.在排序数组中查找元素的第一个和最后一个位置 题解 思路: 1.go自带二分函数sort.SearchInts或者sort.Search 2.函数返回第一个等于target的下标,如果target不存在则返回第一个大于target数的下标 3.由于target可能不在数组中,所有需要对下标进行校验 代码 func searchRange(nums

清风 1069
上一篇: Leetcode76. 最小覆盖子串
下一篇: Leetcode81. 搜索旋转排序数组 II
UestcXiye
博客等级 码龄8年 9032粉丝 1306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值