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

数据结构初阶:详解顺序表OJ题

🔥个人主页:胡萝卜3.0

🎬作者简介:C++研发方向学习者

📖个人专栏:  《C语言》《数据结构》 《C++干货分享》

⭐️人生格言:不试试怎么知道自己行不行

一、移除元素

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

思路1:创建新数组,遍历原数组,将原数组中不为val的元素放入新数组中,遍历完之后,将新数组中的数据拷贝给原数组,最后返回新数组中的数据个数。

将上面的思路转换成代码:

int removeElement(int* nums, int numsSize, int val) {int* tmp=(int*)malloc(sizeof(int)*numsSize);if(tmp==NULL){perror("malloc fail!");exit(1);}//遍历原数组,将不为val的值放入tmp数组中int size=0;for(int i=0;i<numsSize;i++){if(nums[i]!=val){tmp[size++]=nums[i];}}//将tmp中的数据导入原数组中for(int i=0;i<size;i++){nums[i]=tmp[i];}free(tmp);tmp=NULL;return size;
}

时间复杂度为:O(N) 空间复杂度为:O(N)

上面这个思路的时间复杂度已经很好了,但是空间复杂度不是很好,有没有办法可以降低其空间复杂度,ok,接下来我们看一个比较重要的思路。

思路2:双指针法

定义两个变量des和src,刚开始都指向下标0,遍历数组,src找不为val的值,找到后,arr[des]=arr[src],然后des++,src++;如果src==val,src++

将上面的思路转换成代码:

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

时间复杂度:O(N)  空间复杂度为:O(1)

二、删除有序数组中的重复项

26. 删除有序数组中的重复项 - 力扣(LeetCode)

思路1:

  1. 创建一个新数组来存储唯一元素

  2. 遍历原数组,将不重复的元素复制到新数组

  3. 将新数组的内容复制回原数组的前面部分

  4. 返回唯一元素的数量

将上面的思路转换成代码:

int removeDuplicates(int* nums, int numsSize) {int* tmp = (int*)malloc(sizeof(int) * numsSize);if (tmp == NULL) {perror("malloc fail!");exit(1);}// 第一数据肯定是唯一的int count = 0;tmp[count++] = nums[0];for (int i = 1; i < numsSize; i++) {if (nums[i] != nums[i - 1]) {tmp[count++] = nums[i];}}for (int i = 0; i < count; i++) {nums[i] = tmp[i];}return count;
}

时间复杂度为:O(N) 空间复杂度为:O(N)

上面这个思路的时间复杂度已经很好了,但是空间复杂度不是很好,有没有办法可以降低其空间复杂度,ok,接下来我们看一个比较重要的思路。

思路2:双指针

定义两个变量des,src,des=0,src=des+1,遍历数组,src找和des所对应的值不相等的值,找到之后,des++,arr[des]=arr[src],src++;如果和des所对应的值相等,src++,最终返回des+1

将上面的思路转换成代码:

int removeDuplicates(int* nums, int numsSize) {int des=0,src=des+1;while(src<numsSize){if(nums[src]!=nums[des]){des++;nums[des]=nums[src];}src++;}return des+1;
}

时间复杂度:O(N)  空间复杂度为:O(1)

三、合并两个有序数组

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

思路1:先将这两个数组合并,然后再排序

这个思路过于简单,就不再赘述!!!

思路2:从后往前遍历数组,找大(谁大谁先往后放)

将上面的思路2转换成代码:

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {int l1=m-1;int l2=n-1;int l3=m+n-1;//遍历两个数组,谁大往后放while(l1>=0 && l2>=0){if(nums1[l1]>nums2[l2]){nums1[l3--]=nums1[l1--];}else{nums1[l3--]=nums2[l2--];}}//跳出循环//如果nums2中的还有数据,需要特殊处理while(l2>=0){nums1[l3--]=nums2[l2--];}
}

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

相关文章:

  • CUDA 矩阵分块乘法
  • Rust Web开发指南 第六章(动态网页模板技术-MiniJinja速成教程)
  • Docker 核心技术:Union File System
  • 知微集:梯度下降详解
  • 编写TreeMap自定义排序的插曲
  • 信号量使用流程
  • 多媒体内容智能检索技术进展
  • [特殊字符] ​​MySQL性能参数查询总结​
  • 146-延长无线传感器网络生命周期的睡眠调度机制的混合元启发式优化方法!
  • [RK3576][Android14] Android->添加以太网MAC地址选项
  • Spring Boot 实战:接入 DeepSeek API 实现问卷文本优化
  • FFmpeg 实战:从零开始写一个简易视频播放器
  • 视频层和叠加层
  • 数据结构:冒泡排序 (Bubble Sort)
  • Android14 USB子系统的启动以及动态切换相关的init.usb.rc详解
  • mysql主从复制GTID模式
  • Day16_【机器学习—模型拟合问题】
  • AI智能能源管理系统深度剖析:从工业节能到数据中心降耗,解锁企业降本减排新方案
  • Docker 40个自动化管理脚本-1 (20/40)
  • CVPR2019 Oral论文《Side Window Filtering》解读及算法 Python 实现
  • 网络编程3-UDP协议
  • Megatron-Energon 和 Megatron-LM
  • 解锁五大联赛数据:API技术指南
  • Python在AI与数据科学工作流中的新角色:2025年实践指南
  • X-AnyLabeling:Win10上安装使用X-AnyLabeling标注工具
  • 国内永久免费云服务器有哪些?
  • AI视频生成工具全景对比:元宝AI、即梦AI、清影AI和Vidu AI
  • Java学习笔记之——通过分页查询样例感受JDBC、Mybatis以及MybatisPlus(一)
  • CPU、进程、线程上下文切换
  • 使用Rag 命中用户feedback提升triage agent 准确率