二分法题集1

1 二分查找

分析:

这是一道很简单的二分法题,定义两个指针和中间值middle,判断middle对应数组值与目标值的大小关系,从而对left和right进行修改。由于太过基础,代码简单基础就不多赘述。

目录

1 二分查找

分析:

代码展示:

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

分析:

代码展示:

3 搜索插入位置

分析:

代码展示:

4 x 的平方根 

分析:

代码展示:


class Solution {public int search(int[] nums, int target) {int left = 0;int right = nums.length - 1;while(left <= right) {int middle = left + (right - left) / 2;if(nums[middle] < target) {left = middle + 1;}else if (nums[middle] > target) {right = middle -1;}else {return middle;}}return -1;}
}

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

分析:

这道题要求时间复杂度为logn,如果遍历数组时间复杂度最坏就是n,而时间复杂度为logn那就需要用二分法。

注意 二分法不一定要求数组有序,只要该数组存在二段性就可以用二分法。何为二段性,就是通过一个性质可以把数组划分为两段。比如在这道题中我们如果找第一个目标值就可以划分为小于target的为左端,大于等于targert的为右端。

我们定义两个指针left 和 right 分别指向下标0和下标nums.length - 1 。拿案例一分析,left到第一个最后一个7是小于8的区域,第一个8到right是大于等于8的区域。我们用middle来判断当前值与目标值的大小情况。如果小于目标值那么就让left = middle + 1;如果大于那么就让right = middle。

这时我们会发现如果目标值存在于数组,那么left最后一定会指向第一个目标值,因为小于目标值那么就会让left = middle +1,所以必然有middle + 1等于目标值,而且一定是第一个目标值。

代码展示:
class Solution {public int[] searchRange(int[] nums, int target) {if(nums.length == 0) {return new int[]{-1,-1};}int left = 0;int right = nums.length  - 1;int[] arr = new int[2];//找第一个数while(left < right) {int middle = left + (right - left) / 2;if(nums[middle] < target) {left = middle + 1;}else {right = middle;}}if(nums[left] == target)arr[0] = left;else arr[0] = -1;//找最后一个数left = 0;right = nums.length - 1;while(left < right) {int middle = left + (right - left + 1) / 2;if(nums[middle] <= target) {left = middle;}else{right = middle - 1;}}if(nums[left] == target) arr[1] = right;else arr[1] = -1;return arr;}
}

这里有很多细节:

1 while循环的条件必须是left < right:
第一点是因为,如果两个指针相遇那么一定会出结果只需要判断最后是不是目标值即可。第二点是因为(核心),如果条件是left <= right,那么代码就会死循环,当两个指针同时指向目标值时,由于nums[middle] = target,因此right = middle。此时就会不断循环。

2 我们可以看到寻找第一个数和最后一个数的middle求法是不一样的。middle = left + (right - left) / 2 这个求出的中间数是偏左的(比如left指向0下标,right指向1下标,那么这个公式求出的middle最后会指向0下标,相反middle = left + (right - left + 1)/2指向的就是指向1下标),由于上述我们提到如果数组中存在目标值,那么left最终一定会指向第一个目标值,所以我们要求middle是要偏向left一方,还有一个原因就是避免死循环,如果middle偏向right一方,那么right = middle;而求出的middle又指向right。

求最后一个数和求第一个数原理相同,只需要将letf到小于等于目标值划分为左区域,大于目标值划分为有区域,一旦nums[middle[大于目标值就让right = middle - 1.那么如果数组中存在该目标值,right一定会指向目标值的最后一位。

3 搜索插入位置

分析:

做完了上一道题,这道题就显得很简单了。我们看示例二,如果目标值是2,那么我们输出的结果是3的下标。我们可以想到,将小于目标值到left划分为一个区域,大于目标值到right划分为一个区域,那么当nums[middle]小于目标值时,left = middle + 1就能找到最后的结果。我们可以总结为第一个大于目标值的数等同于找第一个目标值,最后一个小于目标值的数等同于找最后一个目标值,方法都是一样的。

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

前两行代码是出去特殊情况,后面方法则等同于上一道题。

4 x 的平方根 

分析:

这道题我们仍然可以用二分法,比如定义一个x长的数组,并求出每一个数组下标的平方值,如果平方值是最后一个小于或者等于目标值的那么就返回该下标。二位破门上面总结了,如果是求最后一个小于目标值的,那么right = middle - 1一定会指向最后一个小于或者等于该目标值的下标。

代码展示:
class Solution {public int mySqrt(int x) {if(x < 1) return 0;long left = 1;long right = x / 2;while(left < right) {long middle = left + (right - left + 1) / 2;if(middle * middle > x) right = middle - 1;else left = middle ;}return (int)left;}
}

这里我们要考虑,范围,由于middle * middle结果太大所以需要用到Long类型,并且最后返回值要强转。

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

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

相关文章

Android Framework 常见解决方案(28)system分区自定义方案

1 原理说明 一般在定制系统时&#xff0c;都会做预置apk和各类其他资源&#xff0c;很有可能超出系统默认设置的系统分区大小&#xff0c;也就会导致编译system时因超出默认设置的分区大小而失败。一般的做法是修改android framework时&#xff0c;修改对应项目的BOARD_SYSTEM…

干货 | 探索CUTTag:从样本到文库,实验步步为营!

CUT&Tag&#xff08;Cleavage Under Targets and Tagmentation&#xff09;是一种新型DNA-蛋白互作研究技术&#xff0c;主要用于研究转录因子或组蛋白修饰在全基因组上的结合或分布位点。相比于传统的ChIP-seq技术&#xff0c;CUT&Tag反应在细胞内进行&#xff0c;创新…

ccf 201703-1分蛋糕

// 分蛋糕 import java.util.Scanner;public class 分蛋糕 {public static void main(String[] args) {Scanner input new Scanner(System.in);int n input.nextInt(); // 蛋糕块数int k input.nextInt(); // 分发蛋糕的重量标准int[] arr new int[n];// 录入每块蛋糕的重量…

51单片机入门:LED点阵屏

LED点阵屏介绍 LED点阵屏由若干个独立的LED组成&#xff0c;LED以矩阵的形式排列&#xff0c;以灯珠亮灭来显示文字、图片、视频等。LED点阵屏广泛应用于各种场合&#xff0c;如&#xff1a;广告屏、公告牌等。 分类&#xff1a; 按颜色&#xff1a;单色、双色、全彩&#x…

nuxt3配置打包静态资源在某一路径下

export default defineNuxtConfig({app: {baseURL: "/account-project"} });

ruoyi-nbcio-plus基于vue3的flowable流程设计器组件的升级修改

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://122.227.135.243:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a…

银行ITSS体系下低代码运维体系实践分享

前言 自2021年中国人民银行发布《金融科技发展规划&#xff08;2022-2025年&#xff09;》以来&#xff0c;商业银行迈入数字化转型的高阶阶段。在此背景下&#xff0c;为了进一步提高金融科技的管理水平&#xff0c;商业银行需要改变传统金融运维模式&#xff0c;对已有运维体…

JUC:实现一个简易的数据库连接池(享元模式)

主要是学习享元模式。 享元模式&#xff08;Flyweight Pattern&#xff09;是一种结构型设计模式&#xff0c;旨在通过共享尽可能多的对象来最小化内存使用和提高性能。在该模式中&#xff0c;对象被分为两种状态&#xff1a;内部状态和外部状态。 内部状态&#xff08;Intr…

红黑树插入机制深度剖析与实践指南

红黑树插入机制深度剖析与实践指南 一、红黑树的基本概念二、插入操作的初步2.1 RB-INSERT-FIXUP过程2.2 循环的不变性2.2.1 情况1&#xff1a;叔节点是红色2.2.2情况2和情况3&#xff1a;叔节点是黑色 三、插入操作的复杂性分析四、伪代码4.1 RB-INSERT 过程4.2 RB-INSERT-FIX…

亚信安慧AntDB:以数据之名,书写创新篇章

随着大数据时代的到来&#xff0c;对数据库的需求愈发强烈。在这一背景下&#xff0c;国产数据库逐渐崭露头角&#xff0c;亚信安慧AntDB作为重要的代表产品之一正积极参与到激烈的市场竞争中。亚信安慧AntDB不仅追求技术的革新和突破&#xff0c;同时也致力于满足用户日益增长…

4月06日,每日信息差

第一、中国电建设计承建的西藏八宿县100兆瓦保障性并网风电项目2日举行开工仪式。项目海拔高达5300米&#xff0c;刷新了之前同样由中国电建设计承建的西藏措美哲古风电场5200米的世界海拔最高风电场纪录 第二、宫崎骏新片《你想活出怎样的人生》上映第4天&#xff0c;中国内地…

理解PostgreSQL中的postmaster.pid

在PG中&#xff0c;一个简要的体系结构图可以大致画成下边的样子&#xff1a; Server端基本上分成backend process和若干background process。这些process都是一个名为postmaster进程的子进程。而postmaster则是postgres进程的别名。 进程概况 [14:42:08-postgrescentos1:/pg…

2024.4.2-day07-CSS 盒子模型(显示模式、盒子模型)

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 作业 2024.4.2 学习笔记CSS标签元素显示模式1 块元素2 行内元素3 行内块元素4…

myweb项目资料集

项目要求 前后端分离后端采用 flask 框架前端采用 vue3 框架 后端部分 Flask 3 框架&#xff1a; https://dormousehole.readthedocs.io/en/latest/quickstart.html Session&#xff1a; https://blog.csdn.net/zhangvalue/article/details/93892241 MySQL 操作&#xf…

嵌入式学习48-单片机1

51单片机—————8位单片机 裸机驱动 无系统 linux驱动 有系统 驱动-----反映硬件变化 MCU 微控器 MPU CPU GPU 图像处理 IDE 集成开发环境 peripheral 外设 SOC&#xff1a; system on chip P0&#xff1a;8bit——8个引脚 位运算 & …

美国CPC认证是什么?为什么必须办理CPC认证呢?

美国CPC认证&#xff0c;全称为Childrens Product Certificate&#xff0c;是儿童产品认证的意思。它主要针对的是在美国市场销售的儿童产品&#xff0c;如玩具、家具、童车、餐椅、床上用品等。CPC认证要求产品安全性高&#xff0c;符合美国加州65、16 CFR等法规要求&#xff…

AI赋能写作:探索设计模式的魅力

设计模式是软件开发中的一种指导性概念&#xff0c;它提供了一套被广泛接受的解决方案&#xff0c;用于常见的设计问题。设计模式有助于提高软件的可重用性、可扩展性和可维护性&#xff0c;并促进团队之间的沟通。 以下是一些常见的设计模式&#xff1a; 创建型模式&#xff1…

艺术与科技的结合,将如何重塑我们对美的认知和创造?AI绘画,是机器的冷冰冰的计算,还是另一种形式的创造力的展现?

在这个充满创新与想象力的时代&#xff0c;人工智能不仅仅是科技的前沿&#xff0c;更是艺术的新领域。今天&#xff0c;我要与大家分享的&#xff0c;不仅仅是一幅幅由AI绘制的奇妙画卷&#xff0c;更是一场关于未来艺术的探索之旅。 你是否曾想象过&#xff0c;未来的画家不再…

15 个最佳 Word 文档恢复工具 [免费下​​载]

MS Word 文档恢复的重要性 对于严重依赖 Microsoft Word 创建和编辑文档的个人和企业来说&#xff0c;MS Word 文档恢复是一个至关重要的方面。 文件损坏、系统崩溃和其他意外事件可能会导致 Word 文档中存储的重要数据丢失。 及时恢复这些文档有助于节省时间、精力和资源。 本…

ChatGPT Excel 大师

原文&#xff1a;ChatGPT Excel Mastery 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 序言 欢迎来到 Excel 掌握的变革之旅&#xff0c;在这里&#xff0c;尖端技术和永恒专业知识在“ChatGPT Excel 掌握&#xff1a;释放专家技巧和窍门的力量”中融合。在当今快节…