数组中的算法

目录

1.什么是数组

2.数组上的算法

2.1二分查找算法

什么是二分查找算法?

算法步骤

算法时间复杂度

一个问题

例题

题目分析

解题代码   

2.2双指针法

什么是双指针法?

例题

题目分析

解题代码


1.什么是数组

数组是在一块连续的内存空间上存储相同类型数据的集合。其实数组也是一种基本的数据结构,也是很多更加高级的数结构的基础,比如 栈、队列、哈希表……都可以基于数组实现。

下图展示了一个长度为12的 int 类型的数组:

需要注意的是: 

  • 数组的下标是从0开始计数的。
  • 数组在内存空间中的地址是连续的。

2.数组上的算法

因为数组的要求是一块连续的内存空间,所以我们可以利用其连续的特性玩一些算法。

2.1二分查找算法

什么是二分查找算法?

二分查找算法(Binary Search Algorithm)是一种在有序数组中查找某一特定元素的搜索算法。

算法步骤

  • 定义左右两个指针。(这里的指针是形象的说法,代表数字的下标)
  • 计算出中间元素的下标,判断待查找元素与数组中间元素的大小。
  • 如果该特定元素小于中间元素,则在中间元素的左边的区间进行查找;需要更新右指针的值。
  • 如果该特定元素大于中间元素,则在中间元素的右边的区间进行查找;需要更新左指针的值。

算法时间复杂度

这种搜索算法每一次比较都使搜索范围缩小一半,因此其时间复杂度为O(log n),其中n是数组的长度。

一个问题

整个查找过程在一个循环中进行,在未找到指定元素的情况下,左指针不断向右移,右指针不断向左移,那么循环的结束条件是什么呢?是left < right 还是 left <= right 呢?

怎么写这个循环的结束条件,主要取决于left == right 的情况是否有意义,有意义就写成 <= ,没有意义就写成 < ;那么 left == right 到底有没有意义,主要取决于right指针的定义,right指针的定义决定了待查找的区间是 左闭右闭 还是 左闭右开 的。

例题

题目链接 —— 二分查找  (题目来源于力扣)

题目:给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1

题目分析

题目表明给定的数组是有序的,并且是升序,也就是说数组中没有重复的元素,因此查找到的下标是唯一的,我们可以考虑使用二分查找算法。

解题代码   

写法一:定义左闭右闭区间。当我们定义区间为左闭右闭时,left == right 这种情况是有效的。

// 定义左闭右闭
class Solution {
public:int search(vector<int>& nums, int target) {int left = 0;int right = nums.size()-1;while(left <= right) //left == right 有意义{int mid = left + (right-left)/2; // 防止溢出if(nums[mid] > target) {right = mid-1;}else if(nums[mid] < target){left = mid+1;}else{return mid;}}return -1;}
};

写法二:定义左闭右开区间。当我们定义左闭右开区间时,left == right 这种情况是没有意义的。

// 定义左闭右开
class Solution {
public:int search(vector<int>& nums, int target) {int left = 0;int right = nums.size();while(left < right) //left == right 没有意义{int mid = left+(right-left)/2;if(nums[mid] < target){left = mid+1;}else if(nums[mid] > target){right = mid;}else{return mid;}}return -1;}
};

2.2双指针法

什么是双指针法?

双指针法就是用两个指针来标记数组中的元素,能够提高遍历的效率。

我们平时遍历数组的时候,都是使用一个变量来标记数组遍历的位置,但是有些情况下,一个变量不够用,这个时候就可以考虑多使用一个变量;如果还是不够,你甚至还能再增加一个变量来标记。

例题

题目链接 —— 移除元素  (题目来源于力扣)

题目:给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。

题目分析

题目说要我们原地移除所有数值等于val元素,但是数组是连续的空间,如果在中间移除元素,就需要将后面所有的元素都向前移动一个位置,这样一来时间复杂的会非常大。所以,在解决数组中需要删除元素的时候,我们通常考虑找一个合适的值,使用覆盖来达到删除的目的。

解题代码

解法一:暴力解法

// 暴力解法
class Solution {
public:int removeElement(vector<int>& nums, int val) {int size = nums.size();for(int i = 0; i < size; ++i) // 遍历数组,找到需要删除的值{if(nums[i] == val) //就需要移除了{// 从需要删除的值的后面找一个值来覆盖for(int j = i+1; j < size; ++j) {nums[j-1] = nums[j];}i--;size--;}}return size;}
};

解法二:双指针法

// 双指针解法
class Solution {
public:int removeElement(vector<int>& nums, int val) {int fast = 0;int slow = 0;for(fast = 0; fast < nums.size(); ++fast){if(nums[fast] != val)  // 找到不等于val的值放到前面去{nums[slow++] = nums[fast];}}return slow;}
};

双指针法对比与暴力解法,可以看出省略了一个查找替换循环的循环,减少了不必要的重复的查找。因此优化了代码的时间复杂度。

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

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

相关文章

【vuejs】富文本框输入的字符串按规则解析填充表单

今天遇到一个批量添加信息的需求&#xff0c;按照格式要求解析后填充到表单中&#xff0c;不符合规则的直接过滤掉 注&#xff1a;添加的信息都是随机生成&#xff0c;不用于实际用途 这是弹框输入的文本解析代码 export const editValToArr (value, bankArr) > {return n…

vue2-render:vue2项目使用render / 基础使用

一、本文内容 本文内容记录render常用的一些属性和方法的配置&#xff0c;以作参考 export default { data() {return { modelValue: ,key: 0,}; }, render(h) { return h(div, [ h(input, {class: input,attrs: { type: text }, key: this.key,props: { value: thi…

【mysql进阶】2-4. mysql 系统库

mysql System Schema (mysql系统库) Mysql Schema是⼀个系统库&#xff0c;表中存储了MySQL服务器运⾏时所需的信息。⼴义上&#xff0c;mysqlschema包含存储数据库对象元数据的数据字典和⽤于其他操作⽬的的系统表。数据字典表和系统表位于数据⽬录下⼀个名为 mysql.ibd 的表…

“声音”音源设置和音效播放

学习如何使用音效系统&#xff0c;背景音乐和其他特别的音效&#xff0c;跳跃攻击等等 学习如何在unity当中使用整套的音效系统&#xff0c;使用之前&#xff0c;我们先来确定一下我们要使用的音乐和音效&#xff0c;在Unity Asset Store当中搜索&#xff0c;添加到我们的unit…

详解Oracle审计(二)

题记&#xff1a; 本文将承接上篇详细介绍oracle的审计功能&#xff0c;基于11g版本&#xff0c;但对12c&#xff0c;19c也同样适用。 1. 语句审计实操演示实例 sqlplus / as sysdba show parameter audit_trail alter system set audit_traildb_extended scopespfile; star…

OpenCV和HALCON

OpenCV和HALCON是两种广泛用于图像处理和计算机视觉的开发库&#xff0c;它们各有优缺点&#xff0c;适合不同的应用场景。以下是两者的比较&#xff1a; 1. 开发背景与定位 OpenCV (Open Source Computer Vision Library)&#xff1a; 开源库&#xff0c;最初由Intel开发&…

Gitlab 完全卸载–亲测可行

1、停止gitlab gitlab-ctl stop2.卸载gitlab&#xff08;注意这里写的是gitlab-ce&#xff09; rpm -e gitlab-ce 3、查看gitlab进程 ps aux | grep gitlab 4、杀掉第一个进程&#xff08;就是带有好多.............的进程&#xff09; 5、删除所有包含gitlab文件 find / …

【计网】深入理解网络通信:端口号、Socket编程及编程接口

目录 1.端口号 1.1.理解源 IP 地址和目的 IP 地址 1.2.认识端口号 1.3.端口号范围划分 1.4理解 "端口号" 和 "进程 ID" 2.socket编程 2.1.理解 socket 2.2.socket编程的概念 2.3. 传输层的典型代表 认识 TCP 协议 认识 UDP 协议 2.3 网络字节序…

基于Multisim的水位测量电路设计与仿真

1.利用LED指示灯显示水位&#xff08;最低水位、1/4、1/2、3/4、最高水位&#xff09;。 2.达到最高水位时&#xff0c;自动报警。

探索Python与Excel的无缝对接:xlwings库的神秘面纱

文章目录 探索Python与Excel的无缝对接&#xff1a;xlwings库的神秘面纱1. 背景介绍&#xff1a;为何选择xlwings&#xff1f;2. xlwings是什么&#xff1f;3. 如何安装xlwings&#xff1f;4. 简单的库函数使用方法打开工作簿创建工作簿读取单元格数据写入单元格数据保存并关闭…

消息会话—发送消息自动滚动到最底部

背景 在项目开发中&#xff0c;实现用户友好的输入交互是提升用户体验的关键之一。例如&#xff0c;在消息会话页面中&#xff0c;为了确保用户在发送新消息后页面能自动滚动到最底部&#xff0c;从而始终保持最新消息的可见性&#xff0c;需要实现自动滚动功能。这不仅提升了…

Spring Boot集成:高效论坛网站的构建

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理论坛网站的相关信息成为必然。开发合适的论…

【GISBox使用指南】免费实现影像切片的工具,还支持多种格式服务发布!

一、什么是影像数据&#xff1f; 在地理信息系统中&#xff0c;影像数据是指通过遥感技术、摄影测量或其他成像手段获取的&#xff0c;以数字形式存储的地理空间图像信息。这些数据涵盖了从卫星遥感影像、航空摄影影像到地面摄影影像等多种类型&#xff0c;在GIS中的应用广泛而…

知乎付费投流怎么做?如何投放知乎广告?

知识经济背景下&#xff0c;知乎凭借其高质量的内容和精准的用户群体&#xff0c;成为了品牌营销的新蓝海。作为国内领先的知识分享平台&#xff0c;知乎汇聚了大量高学历、高收入、高消费能力的用户&#xff0c;他们对新知识、新产品有着强烈的好奇心和探索欲&#xff0c;是品…

成功解决pycharm软件中按住Ctrl+点击指定函数却不能跳转到对应库中的源代码

成功解决pycharm软件中按住Ctrl点击指定函数却不能跳转到对应库中的源代码 目录 解决问题 解决方法 解决问题 在pycharm软件中按住Ctrl点击指定函数却不能跳转到对应库中的源代码 解决方法

github pages + hugo 搭建静态博客网站

体验地址 1. 起因&#xff0c; 目的: 其实6年前&#xff0c;我就写过这个。 项目代码 博客地址 最近想改写一下。 github 推荐的主题是 Jekyll&#xff0c; 我当时用的就是这个&#xff0c;感觉很麻烦。尤其是文章命名。 新的主题 hugo 用起来还行。 2.过程: 过程记录&am…

比较相同机器上 redis和mysql分别单独承载的 最大连接数量

在相同的机器上&#xff0c;Redis 和 MySQL 的最大连接数量会受到硬件配置&#xff08;如 CPU、内存、网络等&#xff09;、配置参数和应用场景的影响。以下是对 Redis 和 MySQL 在单机环境下最大连接数的比较&#xff1a; Redis 最大连接数量 默认配置&#xff1a; Redis 默…

轻松掌握Win10录屏技巧:四大神器推荐!

在Win10系统中&#xff0c;录屏功能的应用越来越广泛&#xff0c;无论是用于工作演示、在线教学还是游戏分享&#xff0c;一款好用的录屏软件都是必不可少的。今天&#xff0c;我们将推荐四款录屏工具&#xff01; 福昕录屏大师 直达链接&#xff1a;www.foxitsoftware.cn/RE…

iOS--利用UITableViewDataSourcePrefetching实现平滑如丝的无限滚动

前言&#xff1a; 相信大家在网络不好的时候使用列表分页的App会获得非常不好的体验&#xff0c;由于网络的问题&#xff0c;会有明显的卡顿&#xff0c;就像抖音等App&#xff0c;那么我们是否能使用一些手段来优化这个体验呢&#xff1f;这里可以用到UITableView中另一个协议…

Linux Debian12基于ImageMagick图像处理工具编写shell脚本用于常见图片png、jpg、jpeg、tiff格式批量转webp格式

在Linux系统中&#xff0c;使用ImageMagick可以图片格式转换&#xff0c;其中最常用的是通过命令行工具进行。 ImageMagick是一个非常强大的图像处理工具集&#xff0c;它包含了许多用于图像转换的命令。 一、安装ImageMagick&#xff08;如果尚未安装&#xff09;&#xff1…