剑指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.hqwc.cn/news/573067.html

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

相关文章

Docker数据卷挂载

一、容器与数据耦合的问题: 数据卷是虚拟的&#xff0c;不真实存在的&#xff0c;它指向文件中的文件夹 &#xff0c;属主机文件系统通过数据卷和容器数据进行联系&#xff0c;你改变我也改变。 解决办法&#xff1a; 对宿主机文件系统内的文件进行修改&#xff0c;会立刻反应…

用搜索引擎收集信息-常用方式

1&#xff0c;site csdn.net &#xff08;下图表示只在csdn网站里搜索java&#xff09; 2&#xff0c;filetype:pdf &#xff08;表示只检索某pdf文件类型&#xff09; 表示在浏览器里面查找有关java的pdf文件 3&#xff0c;intitle:花花 &#xff08;表示搜索网页标题里面有花…

VTK 示例 基本的流程-事件交互、球体、

流程可以总结如下&#xff1a; 导入所需的头文件&#xff1a; 首先&#xff0c;导入了一系列 VTK 头文件&#xff0c;这些文件包含了所需的类和函数声明。 创建对象&#xff1a; 创建了两个球体&#xff08;一个较大&#xff0c;一个较小&#xff09;&#xff0c;一个平面&…

Spring实战:采用Spring配置文件管理Bean

文章目录 一、Spring框架概述二、实战&#xff1a;采用Spring配置文件管理Bean&#xff08;一&#xff09;创建Jakarta EE项目&#xff08;二&#xff09;添加Spring依赖&#xff08;三&#xff09;创建杀龙任务类&#xff08;四&#xff09;创建勇敢骑士类&#xff08;五&…

亚信安全荣获2023年度5G创新应用评优活动两项大奖

近日&#xff0c;“关于2023 年度5G 创新应用评优活动评选结果”正式公布&#xff0c;亚信安全凭借在5G安全领域的深厚积累和创新实践&#xff0c;成功荣获“5G技术创新的优秀代表”和“5G应用创新的杰出实践”两项大奖。 面向异构安全能力的5G安全自动化响应系统 作为5G技术创…

205基于matlab的关于多目标跟踪的的滤波程序

基于matlab的关于多目标跟踪的的滤波程序&#xff0c;包括采用联合概率数据互联&#xff08;JPDA&#xff09;算法实现两个个匀速运动目标的点迹与航迹的关联&#xff0c;输出两个目标跟踪的观测位置、估计位置以及估计误差。程序已调通&#xff0c;可直接运行。 205 多目标跟踪…

GEC6818开机自动加载驱动与更改开发板的RTC时钟

GEC6818开机自动加载驱动与更改开发板的RTC时钟 本文主要涉及&#xff1a; 1.GEC6818开机自动加载驱动 2.更改开发板的RTC时钟 文章目录 GEC6818开机自动加载驱动与更改开发板的RTC时钟一、开机自动加载驱动或运行程序**STEP1&#xff1a;** 使用vi打开文件profile.命令如下**S…

分享多种mfc100u.dll丢失的解决方法(一键修复DLL丢失的方法)

在使用电脑过程中&#xff0c;我们经常会遇到一些陌生的DLL文件&#xff0c;例如mfc100u.dll。这些DLL文件是动态链接库&#xff08;Dynamic Link Libraries&#xff09;的缩写&#xff0c;它们包含了可以被多个程序共享的代码和数据。今天&#xff0c;我们将深入探讨mfc100u.d…

Windows下载使用nc(netcat)命令

‘nc’ 不是内部或外部命令&#xff0c;也不是可运行的程序&#xff1f; 点击链接地址&#xff0c;下载压缩包。 完成后解压 使用方式&#xff08;三种&#xff09;&#xff1a; 1、直接双击exe使用 2、把这个exe放到cmd启动的默认路径下 放到默认路径下&#xff0c;使用nc&a…

plantegg-10+倍性能提升全过程–优酷账号绑定淘宝账号的TPS从500到5400的优化历程

原文地址:https://plantegg.github.io/2018/01/23/10%E5%80%8D%E6%80%A7%E8%83%BD%E6%8F%90%E5%8D%87%E5%85%A8%E8%BF%87%E7%A8%8B/ 背景说明 2016年的双11在淘宝上买买买的时候&#xff0c;天猫和优酷土豆一起做了联合促销&#xff0c;在天猫双11当天购物满XXX元就赠送优酷会…

开源AI引擎|企业合同管理:自然语言处理与OCR技术深度融合

一、企业应用&#xff1a;合同智能管理 结合NLP和OCR技术&#xff0c;企业可以构建智能化的合同管理系统&#xff0c;实现合同的自动化审查、风险评估和知识抽取。这样的系统不仅能够提高合同处理的效率&#xff0c;还能够降低人为错误&#xff0c;加强风险控制。 例如&#x…

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

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