剑指 Offer 53 - I. 在排序数组中查找数字 I

news2024/11/17 9:46:40

摘要

剑指 Offer 53 - I. 在排序数组中查找数字 I

一、二分查找

1.1 二分查找的分析

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

考虑 target在数组中出现的次数,其实我们要找的就是数组中「第一个等于 target的位置」(记为 leftIdx)和「第一个大于 target的位置减一」(记为 rightIdx)。当 target在数组中存在时,target在数组中出现的次数为 rightIdx−leftIdx+1。

二分查找中,寻找 leftIdx即为在数组中寻找第一个大于等于 target的下标,寻找 rightIdx即为在数组中寻找第一个大于 target的下标,然后将下标减一。两者的判断条件不同,为了代码的复用,我们定义 binarySearch(nums, target, lower) 表示在 nums 数组中二分查找 target 的位置,如果 lower 为 true,则查找第一个大于等于 target 的下标,否则查找第一个大于 target的下标。

最后,因为 target 可能不存在数组中,因此我们需要重新校验我们得到的两个下标 leftIdx 和 rightIdx,看是否符合条件,如果符合条件就返回 rightIdx−leftIdx+1,不符合就返回 0。

图片.png

图片.png

1.2 二分查找的复杂度

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

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

1.3 code 示例

public int search3(int[] nums, int target) {
    int len = nums.length;
    if (len == 0) {
        return 0;
    }
    int firstposition = findFirstPostition(nums, target);
    if (firstposition == -1) {
        return 0;
    }
    int lastposition = findLastPostition(nums, target);
    System.out.println(firstposition);
    System.out.println(lastposition);
    return lastposition - firstposition + 1;
}

private int findLastPostition(int[] nums, int target) {
    int left = 0;
    int right = nums.length - 1;
    while (left < right) {
        int mid = left+(right-left+1)/2;
        if (nums[mid] <= target) {
            left = mid;
        } else {
            right = mid-1;
        }
    }
    return left;
}

private int findFirstPostition(int[] nums, int target) {
    int left = 0;
    int right = nums.length - 1;
    while (left < right) {
        int mid = left+(right-left)/2;
        if (nums[mid] < target) {
            left = mid + 1;
        } else {
            right = mid;
        }
    }
    if (nums[left] == target) {
        return left;
    }
    return -1;
}

图片.png

/**
 * @description 利用数组有序 利用二分查找的 log(n)  空间是 O(0)
  * @param: nums
 * @param: target
 * @date: 2022/12/8 11:27
 * @return: int
 * @author: xjl
*/
public int search2(int[] nums, int target) {
    int count=0;
    int index = Arrays.binarySearch(nums, target);
    if (index<0){
        return 0;
    }else {
        int left=index-1;
        while (left>=0){
            if(nums[left]==target){
                count++;
                left--;
            }else {
                break;
            }
        }
        int right=index+1;
        while (right<nums.length){
            if(nums[right]==target){
                count++;
                right++;
            }else {
                break;
            }

        }
        return count+1;
    }
}

二、暴力方法

直接遍历就可以知道目标值的次数。但是这样的做法太过于暴力和简单了。本题目就是考察顺序数组的二分查询特点。

1.3 复杂度分析

  • 时间复杂度: O(n) ,其中 n为数组的长度。

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

2.3 code 示例

/**
 * @description 查询目标的数字在的次数
  * @param: nums
 * @param: target
 * @date: 2022/12/8 11:25
 * @return: int
 * @author: xjl
*/
public int search(int[] nums, int target) {
    int count=0;
    for (int i:nums){
        if (i==target){
            count++;
        }
    }
    return count;
}

博文参考

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

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

相关文章

汇编语言ch2_2 汇编语言中的debug

使用debug 可以完成以下功能&#xff1a; 可以查看 和改变 CPU 中&#xff0c;寄存器的内容&#xff1b;可以查看 和改变内存中的内容&#xff1b;可以将内存中的 机器指令 翻译成汇编指令使用汇编指令 在 内存中 存入 机器指令执行机器指令 首先&#xff0c;启动 Debug,在DO…

实现数智内控,数据分析创造价值——辽宁烟草智能风险体检系统

近两年&#xff0c;烟草行业部分单位围绕中心任务&#xff0c;结合实际&#xff0c;守正创新&#xff0c;开展了许多研究探索。比如&#xff0c;在财务大数据价值挖掘、会计共享中心建设、财务风险预警系统建设等方面做了大量卓有成效的工作。在这样的背景下&#xff0c;辽宁烟…

DSPE-MAL 磷脂改性马来酰亚胺简介CAS1360858-99-6

DSPE-MAL二硬脂酰磷脂酰乙醇胺改性马来酰亚胺 中文名称&#xff1a;二硬脂酰磷脂酰乙醇胺改性马来酰亚胺 英文名称&#xff1a;DSPE-MAL CAS&#xff1a;1235864-97-7 分子式&#xff1a;C48H86N2NaO11P 分子量&#xff1a;921.16700 外观&#xff1a;白色粉末 DSPE-MAL二…

2022icpc 济南站 持续补题

链接&#xff1a;Dashboard - 2022 International Collegiate Programming Contest, Jinan Site - Codeforces 签到题&#xff1a;k K. Stack Sort You are given a permutation with nn numbers, a1,a2,…,an(1≤ai≤n,ai≠aj when i≠j). You want to sort these numbers …

WY易盾cb、fp逆向分析

内容仅供参考学习 欢迎朋友们V一起交流&#xff1a; zcxl7_7 目标 网址&#xff1a;案例地址 这个好像还没改版&#xff0c;我看官网体验那边已经进行了混淆 分析 这个进行的请求很乱&#xff0c;我就不说怎么找的了&#xff0c;到时候越听越乱。一共有2个请求很重要 …

笔试题之编写SQL按要求查询用户阅读行为数据

紧张源于恐惧&#xff0c;恐惧源于未知。 文章目录前言一、SQL题目二、当时作答结果三、复盘&#xff08;一&#xff09;建表并自定义插入数据&#xff08;二&#xff09;正确解答&#xff08;三&#xff09;答错原因分析总结前言 分享本人一次失败的笔试经历&#xff0c;供各…

plink中的BGEN格式的数据如何用

这里&#xff0c;介绍一下BGEN格式的数据&#xff0c;他的文件格式是这样的&#xff1a;a.bgen&#xff0c;这是一个新的数据格式&#xff0c;目前应用不如plink的二进制文件&#xff1a;.bim,.bed,.fam。这里介绍一下如何相互转换。 1. bgen格式介绍 现代遗传关联研究通常使…

[附源码]计算机毕业设计JAVA中小企业人事管理系统

[附源码]计算机毕业设计JAVA中小企业人事管理系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM my…

HMS Core 6.8.0版本发布公告

分析服务 ◆ 游戏行业新增“区服分析”埋点模板及分析报告&#xff0c;支持开发者分服务器查看用户付费、留存等指标&#xff0c;可进一步评估不同服务器的玩家质量&#xff1b; ◆ 新增营销活动报告&#xff0c;可查看广告任务带来的曝光、点击相关信息&#xff0c;让营销推…

阿里P7晒工资条,看完真的扎心了……

前几天&#xff0c;有位老粉私信我&#xff0c;说看到某95后学弟晒出阿里P7的工资单&#xff0c;他是真酸了…想狠补下技术&#xff0c;努力冲一把大厂。 为了帮到他&#xff0c;也为了大家能在最短的时间内做面试复习&#xff0c;我把软件测试面试系列都汇总在这一篇文章了。…

关于信息系统监理师考试怎么备考?

信息系统监理师是属于软考的中级科目&#xff0c;是水平考试&#xff0c;取得证书后就具备了任职中级职称的资格&#xff0c;并可以注册为信息系统监理师&#xff0c;进行信息系统监理工程师的执业工作。 注册监理工程师&#xff0c;是指经考试取得中华人民共和国监理工程师资…

041-推箱子游戏1

上一讲:040-JAVA集合及GUI综合应用(实现简单的订单管理系统)_CSDN专家-赖老师(软件之家)的博客-CSDN博客 下一讲:推箱子游戏源代码 摘要: 1、使用JAVA基础知识 2、GUI界面编程实现推箱子界面,常用控件的综合应用; 3、使用JAVA绘图技术实现推箱子过程的绘图功能;…

追觅身陷「多事之秋」!一场无法投机的「卡位战」

清洁电器市场正释放着新的商业活力。 GfK数据显示&#xff0c;今年上半年在整体家电市场低迷的同时&#xff0c;清洁机器人市场零售额保持了同比15%的增速&#xff0c;仍然是家电行业的主要增长点。其中&#xff0c;线上市场扫地机器人销售仍然居首位&#xff0c;但洗地机反超…

项目笔记:Arduino读取SD卡

1 硬件连接&#xff08;使用Arduino Uno&#xff09;&#xff1a; CS -> 10 SCK -> 13 MOSI -> 11 MISO -> 12 VCC ->5V GND -> GND 2 让Arduino检测到SD卡 官方测试程序&#xff1a;检测SD卡连接并输出卡型号 /*SD card testThis example shows how use…

Linux 磁盘结构,文件系统与inode

&#x1f9f8;&#x1f9f8;&#x1f9f8;各位大佬大家好&#xff0c;我是猪皮兄弟&#x1f9f8;&#x1f9f8;&#x1f9f8; 文章目录一、关于磁盘①磁盘②CHS寻址⑤磁盘结构的抽象二、文件系统①inode与文件的关系②创建文件&#xff0c;系统做的事③删除文件&#xff0c;系…

如何升级展锐RM500U模组的5GCPE固件

本文镜像&#xff1a;https://blog.csdn.net/weixin_45326556/article/details/128236605 如何升级展锐RM500U模组的5GCPE固件1. 准备工作2. 安装5GCPE串口驱动3. 升级固件3.1 选择固件3.2 选择串口号3.3 下载固件3.4 下载固件意外情况4. 重新启动5.参考文献1. 准备工作 从网盘…

智慧旅游景区Web3D可视化GIS综合运营平台

建设背景 2014年8月&#xff0c;《国务院关于促进旅游业改革发展的若干意见》。 2015年年初&#xff0c;原国家旅游局发布《关于促进智慧旅游发展的指导意见》。 2021年12月&#xff0c;国务院印发《“十四五”旅游业发展规划》。 在国家和有关部门的引导和支持下&#xff…

卡塔尔世界杯-诸神黄昏

世界杯 世界杯概述:国际足联世界杯&#xff08;FIFA World Cup&#xff09;简称“世界杯”&#xff0c;是世界上最高荣誉、最高规格、最高竞技水平、最高知名度的足球比赛&#xff0c;与奥运会并称为全球体育两大最顶级赛事&#xff0c;影响力和转播覆盖率超过奥运会的全球最大…

openGauss数据库安装(2.0.0企业版安装)

目录1. 准备环境2. 预安装3. 正式安装4. 启动并登录数据前言此次数据库的系统安装环境仍然是openEuler20.03LTS,openGauss安装版本是2.0.0版本&#xff0c;相对于极简版安装&#xff0c;确实多了一些工具&#xff0c;例如gs_om工具&#xff0c;极简版安装是没有的&#xff0c;企…

前后端传参

1、路径传参 前端传一个参数&#xff1a;123 后端接收一个参数&#xff1a;123 // /{}是必须写的&#xff0c;id是自定义的// PathVariable 这个注解也是必须写的&#xff0c;否则接不到参数GetMapping("/{id}")//使用什么类型去接收id的值&#xff0c;要看你后端需要…