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

【Leetcodenowcode数据结构】顺序表的应用

系列文章目录

《Leetcode&nowcode代码强化刷题》


文章目录

  • 系列文章目录
  • 前言
  • 正文
    • 一.移除元素
    • 二.删除有序数组中的重复项
    • 三.合并两个有序数组
  • 总结


前言

数据结构与算法是计算机领域的核心,既是面试考察重点,也是优化项目性能的关键。而刷题是掌握它最有效的方式,能帮我们巩固理论、提升解题能力。​
我选择LeetCodeNowCode 作为主要刷题平台:LeetCode 题目丰富、分类清晰,适合夯实基础;NowCode 贴近国内企业笔试场景,助力对接实战需求,二者互补性强。​
这份刷题记录不只是题目与答案的罗列,更会记录解题思路、难点易错点,以及解法优化过程。希望它能成为我的复盘工具,也为其他学习者提供参考。​
接下来,就从第一道题开始,在刷题中积累提升,让数据结构与算法成为解决问题的有力工具。


正文


一.移除元素

题目链接:27.移除元素
题目描述:
在这里插入图片描述
在这里插入图片描述
题目分析
这道题目的意思是,给我们一个数组和一个值val,让我们删除所有数组中所有等于val的数据,并且返回剩下的元素个数k
思路讲解:
首先,我们最容易想到的
我们重新创建一个新数组,遍历原数组,把所有不为val的值放入新数组,遍历完之后,让新数组覆盖原数组,这个方法时间和空间复杂度都是O(n)
除此之外,我们还可以用双指针法来解决这道题目
我们可以先创建两个变量srcdst先都为0
在这里插入图片描述

如果src所在位置元素等于valsrc++继续向后找
在这里插入图片描述

如果src所在位置元素不等val,就把这个值赋dst所在位置dstsrc都++
在这里插入图片描述
由于src++的情况更多,所以一定是它最先走完
这时候我们dst所在位置,就是我们的k

代码展示

int removeElement(int* nums, int numsSize, int val) {// 双指针// 定义一个dst和src// src找不是val的就和给dst,两个都向后// 是,src继续向后找int src = 0;int dst = 0;// src小于元素个数的时候,循环继续while (src < numsSize) {if (nums[src] != val) {nums[dst++] = nums[src++];} else {src++;}}return dst;
}

题解链接:https://leetcode.cn/problems/remove-element/solutions/3808953/lian-biao-wei-cha-by-strange-spencezvf-3rbl/


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

题目链接:26.删除有序数组中的重复项:
题目描述:
在这里插入图片描述
在这里插入图片描述

题目分析
题目意思就是让我们删除数组中重复的元素,并且返回删除后数组的元素个数k
思路讲解:
同样的,我们还是可以开辟新数组
但是参考第一道题目,我们可以思考使用双指针
只不过,现在我们让src=1dst=0
在这里插入图片描述
如果dst==src,我们src++向后
在这里插入图片描述

如果dst!=src,我们dst++向后,src赋给我们的dstsrc再向后++
在这里插入图片描述

但是我们dst可能和src会指向同一个位置,这样赋值就多余了,所以这种情况,我们也不赋值
但是这里最后,我们返回的要是dst+1
代码展示

int removeDuplicates(int* nums, int numsSize) {// 方法二// 双指针int src = 1;int dst = 0;// src==dst,src++;// src!=dst,src++赋值dst ++while (src < numsSize) {if (nums[src] != nums[dst] && ++dst != src) {nums[dst] = nums[src];}src++;}return dst + 1;
}

题解链接:https://leetcode.cn/problems/remove-duplicates-from-sorted-array/solutions/3808974/shuang-zhi-zhen-by-strange-spencezvf-22zw/


三.合并两个有序数组

题目链接:88.合并两个有序数组:
题目描述:
在这里插入图片描述

题目分析
这道题目让我们按照非递减的顺序,合并两个数组
有题目意思可以知道,其实就是合并到第一个数组
思路讲解:
首先,第一个方法,我们直接把两个数组合并,然后用排序算法排序,可是时间复杂度可能比较大
我们想第二种方法,就是从小到大遍历·比较两个数组的数据,直接在第一个数组上进行放置,但是这个方法会覆盖没有比较的元素
这时候我们发现,第一个数组在原来的空间上已经给我们开辟好了n+m个位置,我们可以反过来,从大往小去排,这样即便我们总是放入的是第二数组数据,我们还是可以不覆盖任何一个元素
我们先定义三个变量,分别指向下面的这三个位置
在这里插入图片描述
比较l1l2的值,在l3位置进行插入
当其中一个数组遍历完之后,再把剩下的元素依次插入,这样就可以实现数组的顺序合并了
代码展示

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {// 依次比较两个数组中的元素大小,// 从大往小放int l1 = m - 1;int l2 = n - 1;int l3 = n + m - 1;while (l1 >= 0 && l2 >= 0) {// 比较if (nums1[l1] > nums2[l2]) {nums1[l3--] = nums1[l1--];} else {nums1[l3--] = nums2[l2--];}}while (l2 >= 0) // l1先结束,继续放nums2的数据{nums1[l3--] = nums2[l2--];}
}

题解链接:https://leetcode.cn/problems/merge-sorted-array/solutions/3809009/shu-zu-de-he-bing-by-strange-spencezvf-exe7/


总结

顺序表部分的题目,代码思维相对适中,但是其中也不缺乏一些技巧性的东西,我们需要勤加练习,反复理解
下一篇我会为大家带来栈和队列相关的题目,希望大家可以多多支持,有什么问题可以评论留言或者后台私信,感谢大家

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

相关文章:

  • 软考高项论文考试攻略2:从备考到写作的专业指南
  • vue2和vue3函数式调用组件学习记录
  • 廊坊市固安县建设局网站中小企业网络设计论文
  • 3D打印技术在金属材料上的应用现状
  • 网站数据库丢失注册公司网站需要什么资料
  • 重生之我在大学自学鸿蒙开发第九天-《分布式流转》
  • 做手机网站公司wordpress萌主题下载
  • 【Android15快速自定义与集成音效实战课】:正式上线了(二百六十二)
  • 数字化时代,企业应该如何看待商业智能BI
  • 算法---队列+宽搜
  • 解锁分布式唯一 ID:技术、实践与最佳方案
  • 检察院门户网站建设方案网站建设a2345
  • GB200 NVL72超节点深度解析:架构、生态与产业格局
  • 课程网站的设计做网站被骗去哪投诉
  • YOLO家族进化史:从V1到V3的跨越
  • Lipschitz连续及其常量
  • 个人做网站公司宁波趋势信息科技有限公司
  • 安装好采集侠网站地图后在哪里查看网站地图精准粉丝引流推广
  • 外贸soho怎么建网站网站的分辨率
  • 子序列问题
  • 多模态大模型Ovis2.5核心技术改进点、训练方法
  • 建网站步骤ps临摹图片做网站的图片犯法吗
  • 网站建设服务的具体条件烟台企业网站开发
  • 如何做分公司网站wordpress数据库版本
  • DeviceNet 转 MODBUS TCP:倍福 CX 系列 PLC 与 MES 系统在 SMT 回流焊温度曲线监控的通讯配置案例
  • 湛江企业自助建站全国网站建设公司实力排名
  • Redux和@reduxjs/toolkit同时在Next.js项目中使用
  • 从个人贡献者到团队引领者:测试团队的知识管理与能力建设
  • 机械臂动作捕捉系统选型指南:从需求到方案,NOKOV 度量光学动捕成优选
  • 网站开发标准商务网站的推广方法有哪些