【初阶数据结构】顺序表OJ题讲解

前言 

📚作者简介:爱编程的小马,正在学习C/C++,Linux及MySQL。

📚本文收录与初阶数据结构系列,本专栏主要是针对时间、空间复杂度,顺序表和链表、栈和队列、二叉树以及各类排序算法,持续更新!

📚相关专栏C++及Linux正在发展,敬请期待!

目录

前言 

1. 顺序表的基础OJ题讲解

1.1 第一题 

1.2 第二题 

1.3 第三题 

1.4 第四题 

总结


1. 顺序表的基础OJ题讲解

1.1 第一题 

首先说明需要使用leetcode力扣这个平台进行算法的练习,第一道题的OJ链接我放在这里,同学们点进去就可以做题了:移除元素

题目描述:

给你一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组

题目分析: 

这道题实际上考查的是不开辟新的数组空间,能不能在原数据上操作就可以完成删除。

我给同学们提供一个思路,供你们参考

​ 

 首先建立两个指针,都指向数据的首元素的位置,然后src依次往后走, 如果和val相同我就跳过,如果不同我就把这个位置的元素拷贝到dst指向的位置,然后dst往后走,src往后走,遍历完成了,是不是返回dst就可以了,我们一起来实现一下这个代码:  

int removeElement(int* nums, int numsSize, int val)
{int src = 0;int dst = 0;while(src<numsSize){if(nums[src] == val){src++;}else{nums[dst++] = nums[src++];}}return dst;
}

 1.2 第二题 

第二题的OJ链接:删除有序数组中的重复项 

 题目描述:

给你一个非严格递增排列的数组 nums ,请你原地删除重复出现的元素,使每个元素只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。

  • 更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。
  • 返回 k 。

 题目思路:

这道题虽然提示了说需要原地删除,但是没有限定完全空间复杂度,所以使用新数组也能过,但是我在这里给大家讲解一种新的方法,原地删除。

​ 

就是src1 和 src2用于遍历数组,当src1和src2的数据元素值不同时,就把src1的值拷贝给dst,然后dst往后走一步,这时候再把src2拷贝给src1继续遍历是不是就完成了?一起来看下代码: 

int removeDuplicates(int* nums, int numsSize) 
{int src1 = 0;int src2 = 1;int dst = 0;while(src2<numsSize){if(nums[src2] != nums[src1]){nums[++dst] = nums[src2];src1 = src2;}else{src2++;}}return dst+1;
}

 1.3 第三题 

 第三题的OJ链接:合并两个有序数组

给你两个按非递减顺序排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。

请你合并 nums2 到 nums1 中,使合并后的数组同样按非递减顺序排列。

注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。

题目分析: 

这道题也是希望不开辟新数组,就在原数组中完成合并。很多同学就说了,是不是我可以先把两个数组合并,再用快排qsort排序就可以了?其实不行,为什么呢?qsort的时间复杂度是O(N)=N*logN,在OJ题肯定过不去,那我们有没有办法在O(N)的时间复杂度下完成这个算法呢?

​ 

 这样子可不可以,其实不行。同学们想一想,如果我按照题意如果我再nums1,可能是从后往前插入,如果从前往后是会造成数据的覆盖的,那么我们是不是从后往前遍历,依次比较是不是就可以。  

​ 

然后还有一个点,就是如果nums2先结束,那没问题,输入nums1即可,但是nums1先结束呢?是不是还需要把nums2之后的值拷贝到nums1中,结束为止,在输出nums1,对不对,这样是不是就可以了?同学们一起看下代码: 

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{int end1 = m-1;int end2 = n-1;int i = m+n-1;while(end1>=0 && end2 >=0){if(nums1[end1]>nums2[end2]){nums1[i--] = nums1[end1--];}else{nums1[i--] = nums2[end2--];}}while( end2 >= 0 ){nums1[i--] = nums2[end2--];}
}

1.4 第四题 

第四题的OJ链接: 消失的数字

题目描述:数组nums包含从0n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?

题目分析:

这道题可以用暴力解决的,就是我把新数组和i依次遍历比较,找出那个不相等的,然后返回就可以了,这个的时间复杂度是多少,其实是O(N) = N^2,肯定是过不去的。

那我们可以使用一个很巧的方法,是异或法,怎么操作呢?因为异或有个很好的特性是相同为0,所以分别异或两次是不是就可以找到了?比方说看我这个图:

​ 

代码:


int missingNumber(int* nums, int numsSize)
{int ret = 0;for(int i = 0; i<numsSize;i++){ret ^= nums[i]; }for(int i = 0; i<numsSize+1;i++){ret ^= i; }return ret;
}

总结

1、同学们一定要将这次讲的题都自己做一遍,对顺序表会有更好的理解

2、算法题和我们之前刷的牛客网题还不一样,大家一开始要适应

如果这份博客对大家有帮助,希望各位给小马一个大大的点赞鼓励一下,如果喜欢,请收藏一下,谢谢大家!!!
制作不易,如果大家有什么疑问或给小马的意见,欢迎评论区留言。

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

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

相关文章

基于ambari hdp的kafka用户授权读写权限

基于ambari hdp的kafka用户授权读写权限 版本Kafka 2.0.0添加自定义配置修改admin密码重启kafka授权读取授权写入有效通配符部分举例 版本Kafka 2.0.0 添加自定义配置 authorizer.class.name kafka.security.auth.SimpleAclAuthorizer super.users User:admin allow.everyo…

【LLM 论文】Step-Back Prompting:先解决更高层次的问题来提高 LLM 推理能力

论文&#xff1a;Take a Step Back: Evoking Reasoning via Abstraction in Large Language Models ⭐⭐⭐⭐ Google DeepMind, ICLR 2024, arXiv:2310.06117 论文速读 该论文受到的启发是&#xff1a;人类再解决一个包含很多细节的具体问题时&#xff0c;先站在更高的层次上解…

Android 屏幕适配全攻略(上)-掌握屏幕单位,应对千变万化的设备

本文从 Android 开发中常见的长度单位 px、dp、sp 入手&#xff0c;详细介绍了它们的特点及转换关系。 接着深入探讨了屏幕尺寸、分辨率、像素密度等重要的屏幕指标&#xff0c;帮助读者全面理解它们之间的联系。最后&#xff0c;通过实例代码演示了如何在代码中进行单位转换&…

三分钟上手安全渗透系统Kali Linux

kali linux系统集成了常用的安全渗透工具&#xff0c;省去了安装工具的时间&#xff0c;做安全相关的工作是非常推荐使用的。 安装Kalii Linux 安装系统 一般使用虚拟机进行安装&#xff0c;Kali Linux基于Debian内核&#xff0c;虚拟机的操作系统选择Debian 7.x 64 选择系统…

【SRC实战】一键完成全部任务获取奖励

挖个洞先 https://mp.weixin.qq.com/s/LkPfJuuP1K8vaFXRn-8wVg “ 以下漏洞均为实验靶场&#xff0c;如有雷同&#xff0c;纯属巧合 ” 01 — 漏洞证明 一、业务逻辑 “ 如何欺骗APP完成任务获取奖励&#xff1f; ” 1、记录金币数量20 2、浏览商品详情页 3、点击浏览提…

我们应该如何做参与式观察

记得多年以前&#xff0c;有个朋友问我&#xff1a;对于做观察&#xff0c;有人通过教授绘画技巧来教人如何做观察。你们研究员又不会画画&#xff0c;你们如何让人相信你们更会观察呢&#xff1f;坦率说&#xff0c;当时我被问住了&#xff0c;因为我从来没有进行过这样的对比…

day5Qt作业

服务器端 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//准备组件&#xff0c;初始化组件状态this->setFixedSize(800,600);chatwidget new QListWidge…

代码随想录算法训练营第四十九天| 123.买卖股票的最佳时机III,188.买卖股票的最佳时机IV

目录 题目链接&#xff1a;123.买卖股票的最佳时机III 思路 代码 题目链接&#xff1a;188.买卖股票的最佳时机IV 思路 代码 总结 题目链接&#xff1a;123.买卖股票的最佳时机III 思路 与之前买卖股票不同的是本题要求最多买卖两次&#xff0c;那么dp数组以及递推公式都…

攻击者正在利用AI,对保险公司发起大规模欺诈

保险欺诈一直是保险行业面临的重要挑战之一&#xff0c;尤其随着技术的进步&#xff0c;欺诈者也在不断更新其手段&#xff0c;利用AI技术&#xff0c;包括生成式模型、机器学习和数据分析工具等欺骗保险公司&#xff0c;而AI技术的应用正成为他们的新工具&#xff0c;使其犯罪…

如何打造个人IP?

打造个人IP&#xff08;Intellectual Property&#xff09;是当今社会中越来越受到关注的话题。个人IP指的是个人在某个领域内所拥有的独特的、具有商业价值的知识、技能、品牌和影响力。为什么要打造个人IP&#xff1f;如何打造个人IP&#xff1f;下面我将为您详细解答。 首先…

Navicat连接远程数据库时,隔一段时间不操作出现的卡顿问题

使用 Navicat 连接服务器上的数据库时&#xff0c;如果隔一段时间没有使用&#xff0c;再次点击就会出现卡顿的问题。 如&#xff1a;隔一段时间再查询完数据会出现&#xff1a; 2013 - Lost connection to MySQL server at waiting for initial communication packet, syste…

LinkedList链表

LinkedList 的全面说明 LinkList底层实现了双向链表和双端队列特点可以添加任意元素&#xff08;元素可以重复&#xff09;&#xff0c;包括null线程不安全&#xff0c;没有实现同步 LinkedList 的底层操作机制 LinkedList底层维护了一个双向链表LinkList中维护了两个属性fi…

【算法入门赛】A.坐标变换(推荐学习)C++题解与代码

比赛链接&#xff1a;https://www.starrycoding.com/contest/8 题目描述 武汉市可以看做一个二维地图。 牢 e e e掌握了一项特异功能&#xff0c;他可以“瞬移”&#xff0c;每次瞬移需要分别设定 x x x和 y y y的偏移量 d x dx dx和 d y dy dy&#xff0c;瞬移完成后位置会…

【Fastadmin】表格列改input框输入编辑,以排序权重为例

目录 1.自定义权重排序,以字段sort为例 js列代码 在// 初始化表格table.bootstrapTable({ });的后面添加事件 api里面增加formatter方法,如果存在角色权限问题,控制器添

谷歌外链怎么发?

既要数量也要质量&#xff0c;要保证你的链接广泛分布&#xff0c;在数量上&#xff0c;确实需要你的链接在各种平台上有所展现&#xff0c;这样能提升你网站的知名度和曝光率&#xff0c;但是&#xff0c;光有数量是不够的&#xff0c;如果这些链接的内容不行&#xff0c;那对…

ARIMA模型在河流水质预测中的应用_含代码

#水质模型 #时间序列 #python应用 ARIMA 时间序列模型简介 时间序列是研究数据随时间变化而变化的一种算法&#xff0c;是一种预测性分析算法。它的基本出发点就是事物发展都有连续性&#xff0c;按照它本身固有的规律进行。ARIMA(p,d,q)模型全称为差分自回归移动平均模型 (A…

SSH文件传输

一、设置SSH密钥对&#xff0c;实现记住密码 要避免每次使用scp或ssh时都输入密码&#xff0c;你可以设置SSH密钥对&#xff08;一对公钥和私钥&#xff09;&#xff0c;并将公钥添加到远程服务器上。这样&#xff0c;你的系统可以通过密钥自动验证身份&#xff0c;而无需手动…

Blazor入门-基础知识+vs2022自带例程的理解

参考&#xff1a; Blazor 教程 - 生成首个应用 https://dotnet.microsoft.com/zh-cn/learn/aspnet/blazor-tutorial/intro Blazor基础知识&#xff1a;Visual Studio 2022 中的Blazor开发入门_vs2022 blazor webassembly-CSDN博客 https://blog.csdn.net/mzl87/article/detail…

NSSCTF | [SWPUCTF 2021 新生赛]jicao

打开题目&#xff0c;发现高亮显示了一个 php 脚本 这是脚本的内容 <?php highlight_file(index.php); include("flag.php"); $id$_POST[id]; $jsonjson_decode($_GET[json],true); if ($id"wllmNB"&&$json[x]"wllm") {echo $flag;…

idea中数据库的连接(保姆级)

点击idea中的database 然后再点击加号 创建 然后选择第一栏data source 再选择mysql 然后选择数据库的连接方式 再输入密码 这里我们本来就是localhost所有就不用改 选择端口号 然后点击Test Connection 测试连接 第一次连接会下载连接的文件 我们只需要 等待它下载完成就好了 …