【从零开始写博客】数组运用:二分查找和成员增删(day1)

2023-10-27

代码随想录刷题60天

 


目录

数组概述(array)

一、数组的查找

暴力查找(枚举)

二分查找

二、数组的删改

使用快慢指针对数组元素进行增删

总结


 


数组概述(array)

数组作为一种数据结构,毫无疑问,其基本功能便是为程序员提供一种可增删查改的容器,本文将简要的从增删查改这一方面去介绍数组这一种数据结构。


 

一、数组的查找

暴力查找(枚举)

作为一种最基本的查找方式之一,其理解难度较低

int exhaustiveSearch(vector<int>& nums, int target)
	{
		for (int i = 0; i < nums.size(); i++)
		{
			if (nums[i] == target)
				return i;
		}
		return -1;
	}

二分查找

二分查找这一查找方式是利用了被查找数组有序这一特点设计的,查找效率上要比暴力查找高。但在使用二分查找时,需要注意数组边界的开闭。

以下以左闭右闭区间为例:

我们的基本逻辑是将目标值与数组中间值进行比较:如果目标值等于中间值,则返回数组坐标;如果目标值大于中间值,则将数组的左界取为中间值的下一个元素;如果目标值大于中间值,则将数组右界取为中间值的上一个元素。具体实现代码如下:

    int binarySearch(vector<int>& nums, int target)
	{
		if (!nums.size()||target<nums[0])return -1;

		int pLeft=0, pRight=nums.size()-1;
		int pMiddle;
		while (pLeft != pRight)
		{
			pMiddle = (pLeft + pRight) / 2;
			
			if (nums[pMiddle] > target)
				pRight = pMiddle - 1;
			else if (nums[pMiddle] < target)
				pLeft = pMiddle + 1;
			else
				return pMiddle;
		}
		pMiddle = (pLeft + pRight) / 2;
		if (target == nums[pMiddle])
			return pMiddle;
		else
			return -1;
	}

通常情况下,我们在思考一中方法是否可行时,会去思考这种方法的大致实现方法,然后再去思考特例来判断该方法是否可行。如果该特例能够在代码实现过程中,通过添加特殊处理方式来处理掉,那么该方法是可实现的。如果不能,那么,该特例就将成为该方法不可使用的反例。因此,上述代码的实现中有几个点需要我们注意的。

1.当目标容器为空时,直接返回值。这样可以直接避免在取数组右界时造成下标越界这一错误。

2.当目标容器数组边界范围为1时,我们取的左界和右界相等,则不会进入循环。因此我们需要在循环外加一些额外代码来进行特殊情况的处理。

3.当我们在取中间值时,由于除法结果舍去小数来取整的性质,我们取得的中间值是偏小的。因此,在目标容器的边界范围为2的情况下,我们的中间值则会取为左界。当目标值小于中间值时,我们的右界将会取左界的左边,造成边界异常。同理,当我们将每次所取得中间值+1时,中间值偏大,当目标值大于中间值时,我们的左界将取右界的右边,也造成边界异常。

当然,为了规避以上问题,我们可以将代码进行优化,具体如下:

    int binarySearch(vector<int>& nums, int target)
	{
		if (!nums.size())return -1;

		int pLeft=0, pRight=nums.size()-1;//左闭右闭
		int pMiddle;
		while (pLeft <= pRight)
		{
			pMiddle = (pLeft + pRight) / 2;
			
			if (nums[pMiddle] > target)
				pRight = pMiddle - 1;
			else if (nums[pMiddle] < target)
				pLeft = pMiddle + 1;
			else
				return pMiddle;
		}
		return -1;
	}

由此可见,在二叉查找问题中,数组边界问题的讨论,显得尤为重要。

二、数组的删改

使用快慢指针对数组元素进行增删

在对数组进行增删操作时,由于数组的地址是连续的,所以不能对数组中某个元素地址进行删除或向数组某个位置进行数组插入一段带有数据的地址。因此在对数据进行增删操作时,采取的是覆盖。而如果采取覆盖这一手段,则修改某一个数据就要对之后每一个数据进行迁移操作,在面对较多数据时,这样操作的时间复杂度较大,所以我们选取了一种更为方便的手段来对增删数组中元素——快慢指针。

详细代码如下:

    int removeElement(int* nums, int numsSize, int val) 
    {
		int pSlow=0;
		for (int pFast = 0; pFast < numsSize; pFast++)
		{
			if (nums[pFast] != val)
				nums[pSlow++] = nums[pFast];
		}
		return pSlow;
	}

总结

数组作为一种基本的数据结构,其基本功能便是增删查改,而使用合适的方法进行该操作,不仅能大幅减少代码的复杂程度,还能提高增加代码的可读性。

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【从零开始写博客】数组运用:二分查找和成员增删(day1) 的相关文章

  • 为什么“dtoa.c”包含这么多代码?

    我将是第一个承认我对低级编程的整体知识有点稀疏的人 我理解许多核心概念 但我不经常使用它们 话虽这么说 我对需要多少代码感到非常惊讶dtoa c http www netlib org fp dtoa c 在过去的几个月里 我一直致力于用
  • Postsharp 不登录跟踪级别

    我喜欢在跟踪级别记录一些 Postsharp 消息 不幸的是 日志到这个级别没有打印任何输出 所有其他级别都在工作 与控制台或 NLog 后端或从其他类登录时的行为相同 如何启用跟踪级别 应用程序 xaml cs Log Attribute
  • 为什么在 lambda 内部引发异常是 C# 7 的一项功能? [复制]

    这个问题在这里已经有答案了 该语句在 VS2015 中无法编译 但在 VS2017 中可以编译 var example new Action gt throw new Exception 为了支持在 lambda 表达式内抛出异常 必须对
  • 为什么我应该使用内联代码? [复制]

    这个问题在这里已经有答案了 我是一名 C C 开发人员 这里有几个始终困扰我的问题 常规 代码和内联代码之间有很大区别吗 主要区别是什么 内联代码只是宏的一种 形式 吗 选择内联代码时必须进行什么样的权衡 Thanks 表现 正如之前的答案
  • C - 计算文件中的单词、字符和行数。字符数

    我必须用 C 编写一段代码 输出给定文件中的字符数 行数和单词数 任务看起来很简单 但我现在真的不确定出了什么问题 所以 这是代码 include
  • C语言实现延时函数

    我想使用空循环实现延迟函数 但是完成一次循环所需的时间取决于编译器和机器 我希望我的程序自行确定时间并将程序延迟指定的时间 谁能给我任何想法如何做到这一点 注意 有一个名为delay 的函数可以将系统暂停指定的毫秒 是否可以在不使用此功能的
  • 更改图像颜色与透明背景

    我需要使用 c System Drawings 将透明背景上带有绿色圆圈的图像加载到位图图像中 这是最简单的部分 但是 我需要在将其添加到更大的图像之前更改圆圈的颜色 而不影响周围的透明度 就我而言 我需要将圆圈颜色更改为黄色并将其添加为太
  • 为什么 fgets 接受 int 而不是 size_t?

    功能如strcpy malloc strlen 和其他各种接受他们的参数或返回值作为size t代替int or an unsigned int出于显而易见的原因 一些文件功能 例如fread and fwrite use size t以及
  • 使用 LINQ 展平嵌套字典

    所以我有一本形式的字典Dictionary
  • 微软怎么能说WinAPI中一个字的大小是16位呢?

    我刚刚开始学习WinAPI 在MSDN中 对WORD数据类型提供了以下解释 WORD16 位无符号整数 范围是十进制 0 到 65535 该类型在 WinDef h 中声明如下 typedef 无符号短 WORD 很简单 而且它与我一直在使
  • 有没有办法找到dll公开的所有函数

    我一直在寻找一种方法来获取映射到 dll 中函数名称的所有字符串 我的意思是您可以调用 GetProcAddress 的所有字符串 如果你对 dll 进行十六进制转储 符号 字符串 就在那里 但我认为必须有一个系统调用来获取这些名称 如果您
  • 可以通过模板间接访问基类中的私有类型

    我试图在编译时根据类型是否在给定范围内公开可用来选择要使用的类型 最好直接看代码 include
  • Cookie 在 ASP.net 中失去价值

    我有以下设置 cookie 的代码 string locale DropDownList this LoginUser FindControl locale SelectedValue HttpCookie cookie new HttpC
  • 如何在 C 语言中获取输入中的空格

    我想从控制台获取字符数组 它还包含空格 我在 C 中知道的唯一方法是 scanf 但是一旦遇到空格 它就会停止接受输入 我该做什么 这就是我正在做的事情 char address 100 scanf s address 尝试使用 fgets
  • 我的代码哪里有泄漏?

    下面是我的代码 它打开一个 XML 文件 old xml 过滤无效字符并写入另一个 XML 文件 abc xml 最后 我将再次加载 XML abc xml 当执行以下行时 出现异常 表示 xml 文件被另一个进程使用 xDoc Load
  • 从 AuthorizeAttribute 继承的属性不起作用

    我目前正在尝试根据用户角色在新的 ASP MVC 5 应用程序中实现安全性 目标是防止用户在没有特定角色 或更高角色 的情况下访问某些控制器或控制器方法 根据到目前为止我所读到的问题 我创建了一个继承 AuthorizeAttribute
  • 快速将文本附加到文本框

    我有一个BackgroundWorker正在发布消息的线程 使用BeginInvoke在 GUI 中的文本框中 方法 write debug text 在文本框中显示文本使用AppendText并将文本写入Console 外观上是这样的Ba
  • 如何在 stl 模板中使用导出类 (__declspec(dllexport))?

    我正在使用导出的类 class declspec dllexport myclass private template declspec dllexport class std map
  • 从其对象获取结构体字段的名称和类型

    例如 我有一个类似这样的结构 struct Test int i float f char ch 10 我有一个该结构的对象 例如 Test obj 现在 我想以编程方式获取字段名称和类型obj 是否可以 顺便说一句 这是 C 你正在要求C
  • 从 C/C++ 程序进行 Ping

    我想编写一个 C 或 C 程序 给定一个 IP 地址 对其进行 Ping 然后根据 Ping 是否成功执行进一步的操作 这个怎么做 尽情享受Ping 页面 http www ping127001 com pingpage htm 其中有一个

随机推荐

  • Python3.7 Scrapy 提示def write(self,data,asyc) 语法错误

    Scrapy 执行爬虫任务 提示如下错误信息如下 from twisted conch import manhole telnet File D python3 6 Lib site packages twisted conch manho
  • es中修改索引名称命令_在Elasticsearch中更改索引名称

    es中修改索引名称命令 嘿 今天 我碰巧写了一个脚本来解决一个看起来很多人都面临的特定问题 重命名给定的Elasticsearch索引 自然地 有记录在案的解决方案 但是我没有Swift找到一个脚本可以让我找到我想要的位置 来自索引a所有数
  • Latex 字体加粗

    textbf w 显示为 w textbf w w
  • mysql数据库datetime字段转换成java中Date类型

    最终代码展示 输出Account类型对象 使用ResultSet类中的getDate方法只能获取到获取到日期不能得到时间 使用ResultSet类中的getTime方法只能获取到获取到时间不能得到日期 使用ResultSet类中的getTi
  • Java 开发中常见的异常有哪些?

    1 空指针异常 NullPointException 当对象不存在 却又去调用对象的属性或方法时 就会出现该异常 2 数组越界异常 ArrayIndexOutOfBoundsException 当数组只存在5个元素 他们所对应的的下标即为0
  • MySQL显示ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)解决方法

    MySQL显示ERROR 2003 HY000 Can t connect to MySQL server on localhost 10061 解决方法 第一步 在win快捷键下已管理员身份启动cmd命令然后进入mysql安装目录下的bi
  • 10信号学习之signal函数及使用其实现信号捕捉案例

    1 signal函数 功能 该函数注册一个信号捕捉函数 对比上一篇的案例和相关函数 都是针对于信号集操作的 而这个函数是针对处理动作来操作的 你可以利用此函数将捕捉到的信号按自己的方式执行 例如你可以捕捉段错误的信号后执行打印hello w
  • STM32无法下载程序

    新研发了一块STM32板 MCU使用的是STM32F4 前期硬件测试都是正常的 电源等各项硬件指标都是正常的 但是在下载程序测试的时候出现了问题 板子只能下载第一次程序成功 第二次就不能识别芯片 无法下载程序 貌似MCU被锁死 检查原理图并
  • warning: unknown attribute ‘at‘ ignored [-Wunknown-attributes] keil报错处理

    背景在KEIL v6版本编译 attribute at 语句 const unsigned char vis sensor fw attribute at 0X0800C800 0x98 0x14 0x00 0x20 0x65 0x01 0
  • java Spring调试 ApplicationContext cannot be resolved to a type

    今天开发过程中遇到了不能识别导入的Spring jar包的情况 ApplicationContext cannot be resolved to a type 本人分析情况为两种 1 导入的包错误 2 本人遇到的情况 就是jre版本过高 将
  • RawImages图片加载方式

    using UnityEngine using UnityEngine UI public class RawImagesExtend MonoBehaviour Header 资源加载方式 public SourceMode source
  • java底层学习

    额 马上就要面试了 java的底层肯定是需要了解的 网上找了找java的底层文章 做个记号 java底层主要是类的加载 连接和初始化 本文主要分为四个方面 1 java底层概述 2 new和newInstance 方法的区别 3 深入探讨j
  • activiti5之监听器

    activiti5之监听器 业务场景 在使用工作流时 通常伴随着很多具体的需求 例如 activiti人员动态的分配 当前任务节点完成的时候 指定需要指定下一个节点的处理人 比如 一个请假流程 a员工请假 需要指定下一步需要处理请假流程的领
  • Python目标检测数据集格式处理,VOC格式转YOLO格式

    众所周知 CV算法模型训练第一步该做的是数据集制作 最近遇到需要将VOC格式的数据集转为yolo格式 数据集前期的一些预处理参考博客 Python删除txt文档的某一列 fengfeng18k的博客 CSDN博客 Python修改txt某列
  • 卷积神经网络(CNN)入门:使用Python实现手写数字识别

    在上一篇文章中 我们介绍了如何使用Python实现一个简单的前馈神经网络 本文将重点介绍卷积神经网络 CNN 这是一种在计算机视觉任务中表现优异的深度学习模型 我们将从卷积神经网络的基本原理开始 介绍卷积层 池化层和全连接层等概念 然后使用
  • js实现回到顶部效果

    功能 滚动到第二屏才出现 返回顶部 按钮 点击 返回顶部 按钮会返回顶部 而且速度越来越慢 在返回顶部的途中如果用鼠标滚一下滚轮会停止返回顶部的滚动
  • python数据分析(预测性分析与机器学习)

    本文涉及到的主题如下所示 预处理 基于逻辑回归的分类 基于支持向量机的分类 基于ElasticNetCV的回归分析 支持向量回归 基于相似性传播 均值漂移算法 遗传算法 神经网络 决策树算法 1 预处理 在上一章 我们已经做过一次预处理 即
  • 复现iis7/ii7.5的fastcgi解析漏洞

    在windows server 2008 r2上搭建 php服务 1 下载php解释器 地址为http windows php net download 版本有两种 线程安全和非线程安全 线程安全是给apache用的 非线程安全是给iis用
  • 东方树叶、元气森林竞速无糖茶饮

    近几年 随着气泡水 茶饮品的横空出世 零售饮料柜的全糖时代已经渐行渐远 无糖饮料开始占据着半壁江山 据统计 在2023年推出的41款茶饮料新品中 无糖茶的创新超过6成 总计有18个品牌推出25款无糖茶新品 36种口味 所谓无糖茶 也叫原味茶
  • 【从零开始写博客】数组运用:二分查找和成员增删(day1)

    代码随想录刷题60天 目录 数组概述 array 一 数组的查找 暴力查找 枚举 二分查找 二 数组的删改 使用快慢指针对数组元素进行增删 总结 数组概述 array 数组作为一种数据结构 毫无疑问 其基本功能便是为程序员提供一种可增删查改