剑指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;}
}

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

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

相关文章

IntelliJ IDE 插件开发 | (七)PSI 入门及实战(实现 MyBatis 插件的跳转功能)

系列文章 IntelliJ IDE 插件开发 |&#xff08;一&#xff09;快速入门IntelliJ IDE 插件开发 |&#xff08;二&#xff09;UI 界面与数据持久化IntelliJ IDE 插件开发 |&#xff08;三&#xff09;消息通知与事件监听IntelliJ IDE 插件开发 |&#xff08;四&#xff09;来查收…

泛微OA 主表字段更改 修改明细字段的必填或修改属性

1、申请类型&#xff1a;其它类&#xff0c;供应商、规格、金额必填。 2、申请类型&#xff1a;IT设备类&#xff0c;供应商、规格、金额可编辑。 <script>jQuery(document).ready(function(){//绑定主表字段变更事件WfForm.bindFieldChangeEvent("field6669",…

遥感卫星影像质量评价指标汇总

1. 主观评价方法 以人为图像的评价者&#xff0c;根据自己的评价尺度和经验对图像质量进行评价。 2. 客观评价方法 1)均方差 2)信噪比 主要用来评价影像经压缩、传输、增强等处理前后的质量变化情况&#xff0c;其本质与均方差类似。 3)方差 反映了图像各个像元灰度相对…

Ubuntu Desktop 更改默认应用程序 (Videos -> SMPlayer)

Ubuntu Desktop 更改默认应用程序 [Videos -> SMPlayer] References System Settings -> Details -> Default Applications 概况、默认应用程序、可移动介质、法律声明 默认应用程序&#xff0c;窗口右侧列出了网络、邮件、日历、音乐、视频、照片操作的默认应用程序…

MySQL---视图

目录 一、介绍 二、语法 三、视图的更新 四、视图作用 一、介绍 视图&#xff08;View&#xff09;是一种虚拟存在的表。视图中的数据并不在数据库中实际存在&#xff0c;行和列数据来自定义视图的查询中使用的表&#xff0c;并且是在使用视图时动态生成的。 通俗的讲&#…

反勒索组件的核心功能是什么

反勒索组件是一种重要的网络安全工具&#xff0c;旨在防止和应对勒索软件的攻击。勒索软件&#xff0c;通常被称为“勒索病毒”&#xff0c;是一种恶意软件&#xff0c;它会加密用户的文件并要求支付赎金以获取解密密钥。反勒索组件通过一系列的技术和策略&#xff0c;帮助用户…

【开发篇】十一、GC调优的分析工具

文章目录 1、调优的主要指标2、工具一&#xff1a;jstat3、工具二&#xff1a;Visual VM的插件4、工具三&#xff1a;Prometheus Grafana5、生成GC日志6、工具四&#xff1a;GC Viewer7、工具五&#xff1a;GCeasy GC调优&#xff0c;是为了避免因垃圾回收引起程序性能下降&am…

集成学习 | 集成学习思想:Boosting

目录 一. Boosting思想1. Adaboost 算法1.1 Adaboost算法构建流程1.2 sklearn库参数说明 2. Gradient Boosting 算法2.1 Gradient Boosting算法构建流程2.2 Gradient Boosting算法的回归与分类问题2.2.1 Gradient Boosting回归算法均方差损失函数绝对误差损失函数 2.2.2 Gradie…

CentOS离线安装命令

一.引言 某些CentOS安装后默认是没有部分Linux命令的&#xff0c;比如netstat和lsof&#xff1a; 一般情况下我们可以通过yum install安装这些命令。但是在CentOS无法访问公网的时候&#xff08;比如CentOS服务器部署在学校、军工等无法访问外网的环境&#xff09;&#xff0c…

nvm安装以后,node -v npm 等命令提示不是内部或外部命令

因为有vue2和vue3项目多种&#xff0c;所以为了适应各类版本node,使用nvm管理多种node版本&#xff0c;但是当我按教程安装nvm以后&#xff0c;nvm安装以后&#xff0c;node -v npm 等命令提示不是内部或外部命令 首先nvm官网网址&#xff1a;https://github.com/coreybutler/…

108、3D Gaussian Splatting for Real-Time Radiance Field Rendering

简介 官网 更少训练时间的同时实现最先进的视觉质量&#xff0c;能在1080p分辨率下实现高质量的实时(≥30 fps)新视图合成 NeRF使用隐式场景表示&#xff0c;体素&#xff0c;点云等属于显示建模方法&#xff0c;3DGS就是显示辐射场。它用3D高斯作为灵活高效的表示方法&…

布隆过滤器详讲

本文旨在讲解布隆过滤器的原理以及实现方式&#xff0c;希望通过本文能使读者对布隆过滤器有一定的认识&#xff01; 一、布隆过滤器的引入 在讲解布隆过滤器之前&#xff0c;我们还是先提及一下前面讲的位图行&#xff0c;位图可以处理大量的数据&#xff0c;广泛用于查找等…

什么是 MySQL 回表?

什么是 MySQL 回表&#xff1f; 题目 什么是 MySQL 回表&#xff1f; 推荐解析 回表简介 1&#xff09;索引结构&#xff1a;MySQL 使用 B 树索引结构来加速数据的查找。B 树是一种多叉树&#xff0c;它的叶子节点中存储了完整的数据行&#xff0c;而非叶子节点存储了索引…

深度学习pytorch——过拟合欠拟合测试深度学习模型(持续更新)

随着项数越来越多&#xff0c;函数的图形就更加复杂&#xff0c;多项式也更加的复杂。 课时55 过拟合与欠拟合_哔哩哔哩_bilibili 如果利用多项式建造复杂模型&#xff0c;从仅仅一个常数至一个多次方函数&#xff0c;将会发现在线上的点会变得越来越多&#xff0c;这种逐渐接…

【2024系统架构设计】案例分析- 3 数据库

目录 一 基础知识 二 真题 一 基础知识 1 ORM ORM(Object—Relationl Mapping

机器学习——聚类算法-KMeans聚类

机器学习——聚类算法-KMeans聚类 在机器学习中&#xff0c;聚类是一种无监督学习方法&#xff0c;用于将数据集中的样本划分为若干个簇&#xff0c;使得同一簇内的样本相似度高&#xff0c;不同簇之间的样本相似度低。KMeans聚类是一种常用的聚类算法之一&#xff0c;本文将介…

Rust 02.控制、引用、切片Slice

1.控制流 //rust通过所有权机制来管理内存&#xff0c;编译器在编译就会根据所有权规则对内存的使用进行 //堆和栈 //编译的时候数据的类型大小是固定的&#xff0c;就是分配在栈上的 //编译的时候数据类型大小不固定&#xff0c;就是分配堆上的 fn main() {let x: i32 1;{le…

aws使用记录

数据传输&#xff08;S3) 安装命令行 安装awscli: https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/getting-started-install.html#getting-started-install-instructions 直到 aws configure list 可以运行 身份验证&#xff1a; 运行&#xff1a; aws config…

EdgeGallery开发指南

API接口 简介 EdgeGallery支持第三方业务系统通过北向接口网关调用EdgeGallery的业务接口。调用流程如下图所示&#xff08;融合前端edgegallery-fe包含融合前端界面以及北向接口网关功能&#xff0c;通过浏览器访问时打开的是融合前端的界面&#xff0c;通过IP:Port/urlPref…

【力扣hot100】23 合并K个排序链表(c++)解析

23 合并K个排序链表&#xff08;c&#xff09;解析 题解 23 合并K个排序链表&#xff08;c&#xff09;解析1.1 暴力求解1.2 逐一比较1.3 优先队列1.4 逐一合并1.5 分治 在解决「合并K个排序链表」这个问题之前&#xff0c;我们先来看一个更简单的问题: 如何合并两个有序链表?…