【LeetCode热题100】打卡第15天:搜索旋转排序数组在排序数组中查找元素的第一个和最后一个位置

news2025/1/11 22:53:56

文章目录

  • 【LeetCode热题100】打卡第15天:搜索旋转排序数组&在排序数组中查找元素的第一个和最后一个位置
    • ⛅前言
  • 搜索旋转排序数组
    • 🔒题目
    • 🔑题解
  • 在排序数组中查找元素的第一个和最后一个位置
    • 🔒题目

【LeetCode热题100】打卡第15天:搜索旋转排序数组&在排序数组中查找元素的第一个和最后一个位置

⛅前言

大家好,我是知识汲取者,欢迎来到我的LeetCode热题100刷题专栏!

精选 100 道力扣(LeetCode)上最热门的题目,适合初识算法与数据结构的新手和想要在短时间内高效提升的人,熟练掌握这 100 道题,你就已经具备了在代码世界通行的基本能力。在此专栏中,我们将会涵盖各种类型的算法题目,包括但不限于数组、链表、树、字典树、图、排序、搜索、动态规划等等,并会提供详细的解题思路以及Java代码实现。如果你也想刷题,不断提升自己,就请加入我们吧!QQ群号:827302436。我们共同监督打卡,一起学习,一起进步。

博客主页💖:知识汲取者的博客

LeetCode热题100专栏🚀:LeetCode热题100

Gitee地址📁:知识汲取者 (aghp) - Gitee.com

Github地址📁:Chinafrfq · GitHub

题目来源📢:LeetCode 热题 100 - 学习计划 - 力扣(LeetCode)全球极客挚爱的技术成长平台

PS:作者水平有限,如有错误或描述不当的地方,恳请及时告诉作者,作者将不胜感激

搜索旋转排序数组

🔒题目

原题链接:33. 搜索旋转排序数组 - 力扣(LeetCode)

在这里插入图片描述

🔑题解

  • 解法一:二分查找

    将数组一分为二,其中一定有一个是有序的,另一个可能是有序,也能是部分有序。此时有序部分用二分法查找。无序部分再一分为二,其中一个一定有序,另一个可能有序,可能无序。就这样循环!

    二分最难的还是对于边界值的判断,一不小心就有可能会漏掉某个元素

    /**
     * @author ghp
     * @title 搜索旋转排列数组
     */
    class Solution {
        public int search(int[] nums, int target) {
            int l = 0;
            int r = nums.length - 1;
            while (l <= r) {
                int mid = (r - l) / 2 + l;
                if (target == nums[mid]) {
                    return mid;
                }
                // 这个等号一定要加,否则当有两个元素时,会发生遗漏
                if (nums[l] <= nums[mid]) {
                    // 左侧区间有序
                    if (target >= nums[l] && target < nums[mid]) {
                        // target在左侧区间 [l, mid)
                        r = mid - 1;
                    } else {
                        // target在右侧区间 (mid, r]
                        l = mid + 1;
                    }
                } else {
                    // 右侧区间有序
                    if (target > nums[mid] && target <= nums[r]) {
                        // target在右侧区间 (mid, r]
                        l = mid + 1;
                    } else {
                        // target在左侧区间 [l, mid)
                        r = mid - 1;
                    }
                }
            }
            return -1;
        }
    }
    

    备注:

    1. mid = (r - l) / 2 + l; 或者 mid = (l+r)/2时,mid是向下取整的,所以此时nums[l] <= nums[mid]必须要有等号,否则会发生元素遗漏,比如:当nums是3,1,target=1时,就会发生遗漏,直接得到-1
    2. mid= (r - l + 1) / 2 + l时,mid是向上取整的,此时nums[l] < nums[mid]不能取等,同样的如果取等,则会发生元素遗漏

    这两点都是特别需要注意的,也是二分查找的难点

    复杂度分析:

    • 时间复杂度: O ( n ) O(n) O(n)
    • 空间复杂度: O ( 1 ) O(1) O(1)

    其中 n n n 为数组中元素的个数

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

🔒题目

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

在这里插入图片描述

  • 解法一:二分查找

    这一题比上一题要简单许多,看到这种排好序的,然后还要你去寻找满足某个条件的元素,最好的方式就是二分。这题也是在Acwing上刷到过,本次算属于二刷了,所以一下就解决了。解题思路也很简单,就是用两遍二分,一个二分往左逼近,一个二分往右逼近,一下就解决了。同样的二分查早的难点在于分界点的判断,这里不再赘述了(●’◡’●) 本题的详情还看一下我的【Acwing模板题:二分查找】这篇文章,里面有对二分分界点有较为详细的阐述,当然也得多亏 y总 的指点,y总 yyds

    /**
     * @author ghp
     * @title 在排序数组中查找元素的第一个和最后一个位置
     */
    class Solution {
        public int[] searchRange(int[] nums, int target) {
            if (nums.length == 0) {
                return new int[]{-1, -1};
            }
            int first = findFirst(nums, 0, nums.length - 1, target);
            if (first == -1) {
                return new int[]{-1, -1};
            }
            int last = findLast(nums, 0, nums.length - 1, target);
            return new int[]{first, last};
        }
    
        private int findLast(int[] nums, int l, int r, int target) {
            while (l < r) {
                int mid = (r - l + 1) / 2 + l; // 向上取整,往右逼近
                if (target >= nums[mid]) {
                    l = mid;
                } else {
                    r = mid - 1;
                }
            }
            if (nums[l] != target) {
                return -1;
            }
            return l;
        }
    
        private int findFirst(int[] nums, int l, int r, int target) {
            while (l < r) {
                int mid = (r - l) / 2 + l; // 向下取整,往左逼近
                if (target <= nums[mid]) {
                    r = mid;
                } else {
                    l = mid + 1;
                }
            }
            if (nums[l] != target) {
                return -1;
            }
            return l;
        }
    }
    

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

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

相关文章

企业为什么要统一身份认证管理?

身份认证管理(Identity and Access Management&#xff0c;IAM)是一套用来控制用户获取网络系统或应用访问权限的技术与流程。主要包括: 1. 身份管理&#xff1a;创建、删除和维护用户账号&#xff0c;管理用户关键信息如姓名、电子邮件等。这是进行访问控制的基础。 2. 认证管…

Spring Boot 统一功能处理

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;JavaEE &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 目录 ⽤户登录权限效验Spring Boot 拦截器自定义拦截器将自定义拦截器加入到系统配置 拦截器实现原理 统一异常处理创建一个异常处…

金融投资心得(个人领悟篇)

金融投资心得 前言金融还是要参与的如何参与金融始终相信中国经济把控风险选股技巧不赚最后一块"铜板"多学习&#xff0c;学会筛选有用消息 其它思考推荐学习我的投资 前言 本人从2015年开始接触金融&#xff0c;不知不觉跟金融已经打了8年交道了&#xff0c;一路走…

基于STM32的智能饮水机系统设计

一、项目背景 随着智能化的迅速发展&#xff0c;人们对于生活中的各类设备也越来越有智能化的需求&#xff0c;其中智能饮水机是一种比较常见的设备。智能饮水机不仅可以提供饮用水&#xff0c;还可以通过智能化的技术满足人们对于水质、水温、出水量等方面的需求。因此&#…

深入浅出:单链表的实现和应用

&#x1f331;博客主页&#xff1a;青竹雾色间. &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 ✨人生如寄&#xff0c;多忧何为 ✨ 目录 前言 单链表的基本概念 节点 头节点 尾节点 单链表的基本操作 创建单链表 头插法&#xff1a; 尾插法&#…

OpenGL蓝宝书第九章学习笔记:片段着色器和帧缓存

前言 本篇在讲什么 OpenGL蓝宝书第九章学习笔记之片段着色器和帧缓存 本篇适合什么 适合初学OpenGL的小白 本篇需要什么 对C语法有简单认知 对OpenGL有简单认知 最好是有OpenGL超级宝典蓝宝书 依赖Visual Studio编辑器 本篇的特色 具有全流程的图文教学 重实践&am…

Node服务器 - koa框架

1 koa的基本使用 2 koa的参数解析 3 koa响应和错误 4 koa静态服务器 5 koa的源码解析 6 和express对比 koa的基本使用过程 const Koa require(koa)// 创建app对象 const app new Koa()// 注册中间件(middleware) // koa的中间件有两个参数: ctx/next app.use((ctx, next…

Apple Vision Pro:空间计算的未来已来,你准备好了吗?

“ 正如iPhone带我们进入移动计算时代&#xff0c;Apple Vision Pro将带我们进入空间计算时代。” 我虽然没有亲身体验&#xff0c;但观看了许多国内外第一批体验者的体验分享&#xff0c;看得出来&#xff0c;这些体验者都十分兴奋&#xff0c;根据他们的描述&#xff0c;我…

Mac安装zookeeper

文章目录 1.下载zookeeper安装包2.解压安装包3.修改配置文件4.启动服务端5.启动客户端 1.下载zookeeper安装包 https://archive.apache.org/dist/zookeeper/ 选择需要的版本下载 下载的时候要注意下载已经编译好的二进制版本 2.解压安装包 将下载的安装包解压到你想要的位…

基于Faster RCNN时间钢铁表面的缺陷检测

目标检测在许多行业中都有许多实际应用。大多数时候,在工业环境中,物体检测目标很小。因此,有效地训练目标检测模型变得非常困难。其中一个问题是钢材表面缺陷检测。即使使用深度学习,也很难高精度地解决问题。在本文中,我们将使用 PyTorch 库训练 Faster RCNN 对象检测模…

【3DsMAX】从零开始建房(5)

目录 1. 制作护栏 2. 制作梯子 3. 制作二层窗户 1. 制作护栏 选中顶部三条边线 点击“利用所选内容创建图形” 选择线性 此时我们就成功的创建了一个二维样条线 选中样条线上其中的一个点&#xff0c;移动点使线条缩短 缩小一点 渲染 同样的方法再制作一根 新建一个圆柱体 …

浅谈Spring Cloud OpenFeign

OpenFeign是一种声明式、模板化的HTTP客户端。在Spring Cloud中使用OpenFeign&#xff0c;可以做到使用HTTP请求访问远程服务&#xff0c;就像调用本地方法一样的&#xff0c;开发者完全感知不到这是在调用远程方法&#xff0c;更感知不到在访问HTTP请求。 Spring Cloud OpenFe…

临期食品电商 APP 的设计与开发

摘 要 &#xff1a; 在移动互联网和电子商务产业的快速发展中&#xff0c;越来越多的消费者开始慢慢的接触网上购 物&#xff0c;互联网经济的全面动员将席卷全球&#xff0c;各种电商应用将在时代的浪潮中层出不穷。在未来各国的 不断发展中互联网很可能会成为销售各种货物的…

在线商城前台开发环境配置

一、项目配置 node 15.14.0 官网下载 https://nodejs.org/zh-cn/download/releases npm 7.7.6 下载node后自动安装npm&#xff0c;如果版本不对就更换对应版本 npm install react7.7.6 下载项目源码 链接&#xff1a;https://www.123pan.com/s/bT07Vv-WICcv.html 解压到一…

【P50】JMeter 汇总报告(Summary Report)

文章目录 一、汇总报告&#xff08;Summary Report&#xff09;参数说明二、准备工作三、测试计划设计 一、汇总报告&#xff08;Summary Report&#xff09;参数说明 可以查看事务或者取样器在某个时间范围内执行的汇总结果 使用场景&#xff1a;用于评估测试结果 使用频率…

java boot将一组yml配置信息装配在一个对象中

其实将一组yml数据封进一个对象中才是以后的主流开发方式 我们创建一个springboot项目 找到项目中的启动类所在目录 在同目录下创建一个类 名字你们可以随便取 我这里直接叫 dataManager 然后 在yml中定义这样一组数据信息 然后 我们在类中定义三个和这个配置信息相同的字段…

全志V3S嵌入式驱动开发(触摸屏驱动)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 所谓的触摸屏&#xff0c;其实就是在普通的lcd屏幕之上&#xff0c;再加一层屏而已。这个屏是透明的&#xff0c;这样客户就可以看到下面lcd屏幕的…

想要提高办公效率,可以采用表单自定义工具

当前&#xff0c;随着社会的进步和科技的发展&#xff0c;表单自定义工具逐渐在现代化办公场所中得到重用和喜爱。因为它的灵活、简便、易操作等优势特性&#xff0c;使得其突破了传统表单制作工具的局限&#xff0c;成为广大中大型企业实现流程化管理和数字化进程的得力助手。…

UnityVR--组件5--Animation动画

目录 新建动画Animation Animation组件解释 应用举例1&#xff1a;制作动画片段 应用举例2&#xff1a;添加动画事件 Animator动画控制器 应用举例3&#xff1a;在Animator中设置动画片段间的跳转 本篇使用的API&#xff1a;Animation、Animator以及Animator类中的SetFlo…

程序语言排行榜有哪些

程序语言排名 程序语言排行NO.1Java Java是基于类的面向对象的编程语言&#xff0c;拥有跨平台、面向对象、泛型编程的特性&#xff0c;广泛应用于企业级Web应用开发和移动应用开发。任职于Sun Microsystems的詹姆斯高斯林等人于1990年代初开发Java语言的雏形&#xff0c;最初被…