剑指Offer题目笔记19(二分查找)

面试题68:

面试题68

问题:

​ 输入一个排序的整形数组nums和一个目标值t,如果数组nums中包含t,则返回在数组中的下标,否则返回按照顺序插入到数组的下标。

解决方案:

​ 使用二分查找。每次二分查找都选取位于数组中间下标的值,如果目标值等于当前值,返回当前下标。如果目标值大于当前值,那么目标值位于数组后半部分,如果目标值小于当前值,那么目标值位于数组前半部分。

源代码:
class Solution {
    public int searchInsert(int[] nums, int target) {
        int left = 0;
        int right = nums.length - 1;
        while(left <= right){
            int mid = (left+right)/2;
            if(nums[mid] >= target){
                if(mid == 0 || nums[mid - 1] < target){
                    return mid;
                }

                right = mid - 1;
            }else{
                left = mid + 1;
            }
        }
        return nums.length;
    }
}

面试题69:

面试题69

问题:

​ 在一个长度大于或等于3的数组中,找到数组最大值对应的下标。

解决方案:

​ 使用二分查找。因为该数组是先递增后递减就像一座山峰,我们要求峰顶的下标,因此需要找到比它左右两边数字都大的数字对应的下标,如果这个数字比它左边的数字大,并且比它右边的数字要小,故峰顶在后半部分,如果这个数字比它左边的数字小,并且比它右边的数字要大,故峰顶在前半部分。

源代码:
class Solution {
    public int peakIndexInMountainArray(int[] arr) {
        int left = 1;
        int right = arr.length - 2;
        while(left <= right){
            int mid = (left + right) / 2;
            if(arr[mid] > arr[mid+1] && arr[mid] > arr[mid - 1]){
                return mid;
            }

            if(arr[mid] > arr[mid - 1]){
                left = mid + 1;
            }else{
                right = mid - 1;
            }
        }

        return -1;
    }
}

面试题70:

面试题70

问题:

​ 在一个排序的数组中找出唯一只出现一次的数字。

解决方案:
  1. 使用二进制。因为两个相同的数字异或的结果是0,将数组的所有数字进行异或,那么最终结果就是出现一次的数字。
  2. 在一个排序的数组中,将数组中的数字两两分组,最初的若干组的两个数字都是相同的,一旦遇到只出现一次的数字之后,后面的组全是不相同的,故出现不同的第一组的第一个数字就是出现一次的数字。
  3. 使用二分查找。先找出位于中间的一组,确定该组的两个数字是否相同,如果两个数字相同,那么只出现一次的数字在数组后半部分。如果两个数字不相同,需要继续判断该组是不是第一组,如果是第一组,那么该组的第一个数字就是出现一次的数字。如果不是第一组,那么只出现一次的数字在数组前半部分。
源代码:
class Solution {
    public int singleNonDuplicate(int[] nums) {
        int left = 0;
        int right = nums.length/2;
        while(left <= right){
            int mid = (left + right)/2;
            int i = mid * 2;
            if(i < nums.length - 1 && nums[i] != nums[i + 1]){
                if(mid == 0 || nums[i - 2] == nums[i - 1]){
                    return nums[i];             
                }

                right = mid - 1;
            }else{
                left = mid + 1;
            }
        }

        return nums[nums.length - 1];
    }
}

面试题71:

面试题71

问题:

​ 输入一个正整数数组w,实现一个函数pickIndex根据权重比例随机选择一个下标。

解决方案:

​ 使用二分查找。创建一个和权重数组的长度一样的数组sums,新数组的第i个数值sums[i]是权重数组中前i个数字之和。生成一个随机数p,先选取位于数组中间下标的值,如果p小于当前值,再判断p与前一位的值的大小,如果前一位的值小于等于p,那么返回当前下标,如果p大于当前值,那么权重值在数组前半部分,如果p大于当前值,那么权重值在数组后半部分。

源代码:
class Solution {
    private int[] sums;
    private int total;

    public Solution(int[] w) {
        sums = new int[w.length];
        for(int i = 0;i < sums.length;i++){
            total += w[i];
            sums[i] = total;
        }
    }
    
    public int pickIndex() {
        Random random = new Random();
        int p = random.nextInt(total);
        int left = 0;
        int right = sums.length - 1;
        while(left <= right){
            int mid = (left + right)/2;
            if(sums[mid] > p){
                if(mid == 0 || sums[mid - 1] <= p){
                    return mid;
                }

                right = mid - 1;
            }else{
                left = mid + 1;
            }
        }
        return -1;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【学习】软件科技成果鉴定测试有何作用

软件科技成果鉴定测试是针对软件进行项目申报、科技成果鉴定等相关目的进行的测试。软件测试报告可作为项目申报、科技成果鉴定等工作的依据之一。软件类科技成果鉴定测试从软件文档、功能性、使用技术等方面对软件系统进行符合性测试。其测试结果证明软件的质量是否符合技术合…

[DS]Polar靶场web(一)

静以养心&#xff0c;宽以养气。 跟着Dream ZHO大神学专升安的一天 swp 直接dirb扫出.index.php.swp的目录 function jiuzhe($xdmtql){return preg_match(/sys.*nb/is,$xdmtql);//如果包含以 "sys" 开始&#xff0c;后跟任意字符直到 "nb" 的字符串&…

基于Rflysim平台的无人机拦截三维比例导引算法仿真

【后厂村路钢铁侠出品】 一、Rflysim简介 RflySim是一套专为科研和教育打造的Pixhawk /PX4 和MATLAB/Simulink生态系统或工具链&#xff0c;采用基于模型设计&#xff08;Model-Based Design&#xff0c; MBD&#xff09;的思想&#xff0c;可用于无人系统的控制和安全测试。…

勾八头歌之分类回归聚类

一、机器学习概述 第1关机器学习概述 B AD B BC 第2关常见分类算法 #编码方式encodingutf8from sklearn.neighbors import KNeighborsClassifierdef knn(train_data,train_label,test_data):input:train_data用来训练的数据train_label用来训练的标签test_data用来测试的数据…

超级会员卡积分收银系统源码:积分+收银+商城三合一小程序 带完整的安装代码包以及搭建教程

信息技术的迅猛发展&#xff0c;移动支付和线上购物已经成为现代人生活的常态。在这样的背景下&#xff0c;商家对于能够整合收银、积分管理和在线商城的综合性系统的需求日益强烈。下面&#xff0c;罗峰给大家分享一款超级会员卡积分收银系统源码&#xff0c;它集积分、收银、…

什么是RISC-V?开源 ISA 如何重塑未来的处理器设计

RISC-V代表了处理器架构的范式转变&#xff0c;特点是其开源模型简化了设计理念并促进了全球community-driven的开发。RISC-V导致了处理器技术发展前进方式的重大转变&#xff0c;提供了一个不受传统复杂性阻碍的全新视角。 RISC-V起源于加州大学伯克利分校的学术起点&#xff…

计算机视觉之三维重建(4)---三维重建基础与极几何

文章目录 一、三维重建基础1.1 问题引入1.2 线性解法1.3 非线性解法1.4 多视图几何的关键问题 二、极几何与基础矩阵2.1 极几何2.2 极几何特例2.3 本质矩阵2.4 本质矩阵的性质2.5 基础矩阵2.6 基础矩阵的性质 三、基础矩阵估计 一、三维重建基础 1.1 问题引入 1. 从单张图像恢…

蓝桥杯刷题之路径之谜

题目来源 路径之谜 不愧是国赛的题目 题意 题目中会给你两个数组&#xff0c;我这里是分别用row和col来表示 每走一步&#xff0c;往左边和上边射一箭&#xff0c;走到终点的时候row数组和col数组中的值必须全部等于0这个注意哈&#xff0c;看题目看了半天&#xff0c;因为…

Win11电脑cpu温度过高怎么办呢

Win11电脑cpu温度过高怎么办呢&#xff1f;有时候我们感觉电脑发烫&#xff0c;担心电脑过烫会不会损坏。正常情况下&#xff0c;cpu的温度在45~65度之间&#xff0c;但不排除电脑同时开了太多软件&#xff0c;或者在玩吃鸡、英雄联盟等的大型游戏而导致温度超过85度。只要最高…

excel设置数字下拉递增方法

excel数字下拉递增怎么设置&#xff1f;在我们平常表格的编辑中&#xff0c;不可避免的会需要有这样“1、2、3、4”的序列排序下来&#xff0c;但为了可以更加节省时间提高工作效率&#xff0c;我们可以设置下拉数字递增哦&#xff0c;还在一个一个手动输入的朋友们&#xff0c…

数据结构——线性表(一)

线性表&#xff0c;顾名思义&#xff0c;是具有像线一样的性质的表。如同学生们在操场上排队&#xff0c;一个跟着一个排队&#xff0c;有一个打头&#xff0c;有一个收尾&#xff0c;在其中的学生都知道前一个是谁&#xff0c;后一个是谁&#xff0c;这样就像一根线将他们都串…

JWT(JSON Web Token)

JSON Web Token 是一种开放标准&#xff0c;用于在网络上安全传输信息的简洁、自包含的方式。它通常被用于身份验证和授权机制。 JWT 由三部分组成&#xff1a;头部&#xff08;Header&#xff09;、载荷&#xff08;Payload&#xff09;和签名&#xff08;Signature&#xff…

【深度学习】【机器学习】用神经网络进行入侵检测,NSL-KDD数据集,基于机器学习(深度学习)判断网络入侵

文章目录 下载数据集NSL-KDD数据集介绍输入的41个特征输出的含义数据处理&&训练技巧建神经网络&#xff0c;输入41个特征&#xff0c;输出是那种类别的攻击模型训练模型推理写gradio前端界面&#xff0c;用户自己输入41个特征&#xff0c;后端用模型推理计算后显示出是…

linux环境gitlab迁移到新服务器

目录 备份项目备份gitlab配置阿里云磁盘格式化准备 最近服务器中了挖矿病毒&#xff0c;清理几次&#xff0c;都没有搞定&#xff0c;只能重新安装gitlab 备份项目 先把项目备份到本地 git pull git remote prune origin确保本地代码是最新的并且拥有所有的分支 git remote …

自然语言处理3(NLP)—— 机器学习

1. 自然语言处理在机器学习领域的主要任务 自然语言处理&#xff08;NLP&#xff09;在机器学习领域中扮演着至关重要的角色&#xff0c;旨在使计算机能够理解、解释和生成人类语言。以下是NLP在机器学习领域中的主要任务及其分类方法&#xff1a; 1.1 按照功能类型分类 1.1.…

学习可视化比较好用的网站Apache ECharts

Apache ECharts 是一个基于 JavaScript 的开源可视化图表库&#xff0c;它提供了直观、交互丰富且可高度个性化定制的数据可视化图表。这个库最初由百度团队开源&#xff0c;并在 2018 年初捐赠给了 Apache 基金会&#xff0c;成为 ASF 的孵化级项目。在 2021 年 1 月 26 日&am…

Hadoop+Spark大数据技术 第三次作业

第三次作业 1.简述HDFS Shell三种操作命令hadoop fs、hadoop dfs、hdfs dfs的异同点。 相同点 用于与 Hadoop 分布式文件系统&#xff08;HDFS&#xff09;交互。可以执行各种文件系统操作&#xff0c;如文件复制、删除、移动等。 不同点 hadoop fs、hadoop dfs已弃用&#xf…

蓝桥杯刷题day10——猜灯谜【算法赛】

一、问题描述 在元宵节的活动现场&#xff0c;有一串环形排列的灯笼&#xff0c;共计 n 个。每个灯笼上伴随着一个谜底以及一个数字&#xff0c;这些数字分别为 a1,a2 ,…,an。 根据元宵节的传统&#xff0c;每个灯笼的谜底都是由相邻两个灯笼上的数字之和得出的。需要注意的…

R语言 for循环问题

今天偶然发现在R的for循环中&#xff0c;作为循环计次的i&#xff0c; 并不会因为在循环体中的赋值变化而变化。 记录一下&#xff0c;还没有找到相关的解释。

centos2anolis

我的centos7原地升级到anolis7记录 注意&#xff1a;如果是桌面版请先卸载firefox&#xff0c;否则so文件冲突。 参考&#xff1a; CentOS 7和8Linux系统迁移到国产Linux龙蜥Anolis OS 8手册_disable pam_pkcs11 module in pam configuration-CSDN博客 关于 CentOS 迁移龙蜥…