当前位置: 首页 > news >正文

零基础入门C语言之C语言实现数据结构之顺序表经典算法

在阅读本篇文章之前,建议读者优先阅读专栏内前面的文章。

目录

前言

一、经典算法OJ题:移除元素

二、经典算法OJ题:合并两个有序数组

三、关于顺序表的问题和思考

总结


前言

本篇文章借由力扣中的两道经典题目来介绍顺序表中的经典算法。


一、经典算法OJ题:移除元素

我给出这道题的测试链接:

27. 移除元素 - 力扣(LeetCode)

题目描述如下:

其实这道题的思路很简单,我们可以直接创建一个新数组,然后遍历原数组,如果原数组中的数据和我们要求的数据不相等,那就把它移动到新数组中;否则跳过即可。但是很遗憾,题目中已经明确给出了要求,不允许创建新的数组空间,那我们就只能在原数组上进行操作了。

那么在这里我们就可以使用双指针法,也就是创建两个变量src和dst,如果src指向值为val,那就让它自增;否则就让nums[dst] = nums[src],然后二者分别自增即可。这样最后只要返回dst即可。

请读者思考如何实现这段代码,我给出我的示例:

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

二、经典算法OJ题:合并两个有序数组

这道题的链接如下:

88. 合并两个有序数组 - 力扣(LeetCode)

题目描述如下:

同样,这道题的思路也很简单,我们完全可以给两个数组一人一个指针,然后比对二者指向的值的大小,然后按照顺序将其填充到融合的新数组中。但是同样遗憾的是,题目中明确指出让我们将数据都存储在nums1之中,那么此时我们该如何操作呢?

显然我们可以不管三七二十一,直接把nums2数组中的数据全部填充到nums1数组之中,然后使用我们前面讲过的排序算法进行排序,但是由于我们之前讲过的冒泡排序属于效率较为低下的算法,它无可避免的会影响到我们代码整体的运行速度。

此时我们其实可以借鉴一下我们刚开始的思路,我们不必让两个指针都指向最前面的元素,恰恰相反,我们可以让其指向数组的最后一个元素,然后让二者比大小,谁更大就被放在最后面,这样最后一定可以完成。那么这段代码应该如何实现呢?我给出一段示例代码:

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

三、关于顺序表的问题和思考

首先,在涉及到顺序表中间以及头部的插入删除时,时间复杂度为O(n),关于这个时间复杂度我们之后会进行详细说明。其次,在增容时我们需要申请新空间,拷贝数据,释放旧空间,这对于我们的性能有着不小的消耗。最后,我们在增容的时候一般是二倍增长,这就导致了一定程度上的空间浪费。

那么我们该如何解决上述问题呢?很简单,我们需要一种新的数据结构,也就是链表,那么关于链表究竟是什么?我们且听下回分解!


总结

本文通过两道力扣算法题介绍了顺序表的经典处理技巧。第一题"移除元素"采用双指针法直接在原数组操作,第二题"合并有序数组"通过逆向双指针实现高效合并。文章还分析了顺序表在插入删除、空间扩容等方面存在的性能问题,并指出链表结构将是解决这些问题的方向。这两道题目展示了顺序表的基本操作思路,为后续学习更复杂的数据结构奠定了基础。

http://www.dtcms.com/a/594329.html

相关文章:

  • 织梦配置手机网站怎样用虚拟主机建网站
  • Kimi 入驻 GitCode|Kimi K2 Thinking 模型发布并开源,全面提升 Agent 和推理能力
  • 2025模拟设备和单片机(移远EC800M模块)用MQTT协议接入ONENET记录
  • 个人网站设计规划怎么做百度里面自己的网站
  • 简单理解:WWDG窗口看门狗
  • 爬取数据存入SQLite:轻量级数据库实战指南
  • 找个会做网站的 一起做网站互联网开发技术
  • 如何利用R语言 进行生物多样性测定、生物量模型构建、生物完整性指数(IBI)筛选与生态环境状况综合指数(EI)计算
  • 前端开发做网站吗wordpress禁止加载头部
  • 建设网站的基础知识六年级做的网站的软件下载
  • SQL中的NULL陷阱:为何=永远查不到空值
  • 厦门市网站建设软件开发公司营销网站seo推广
  • JDBC模板技术
  • 万网网站后台登陆做网站哪个部分
  • 11月10日学习总结--numpy的基本操作
  • 快速搭建一个 GitHub 开源项目导航网站,提供便捷的信息抓取、智能摘要、分类管理功能
  • 网站数据表怎么做网络推广引流方式
  • 【Rocky基础】——用户管理
  • 免费下载建筑图纸的网站wordpress子分页
  • 数据结构简明教程(李春葆版)课后习题答案
  • 做app网站公司名称如何网络推广新产品
  • CSGHub v1.12.0开源版本更新
  • 上海网站建设报价自建网站怎么做推广
  • Vue Router (编程式导航)
  • 特斯拉 Tesla 面试经验分享|流程全解析 + 技术细节 + 面试感受
  • .net网站开发面试网站平台定制开发
  • 网站制作公司咨询工作内容个人做网站可以盈利么
  • 【Unity】MMORPG游戏开发(十)断线恢复
  • 深圳app开发公司哪家服务好网站建设丶seo优化
  • C#/.NET/.NET Core技术前沿周刊 | 第 期(年.-.)