首页 > 编程语言 >顺序表算法题

顺序表算法题

时间:2024-11-23 14:29:20浏览次数:12  
标签:src 顺序 val dst 复杂度 算法 数组 我们

目录

移除元素

删除有序数组中的重复项

合并两个有序数组


移除元素

我们先根据题目描述和示例构造一个框架,大家也可以先想一想怎么做(做的时候最好画图,因为图能更好地理解)。

(1)时间复杂度O(N^2),空间复杂度O(1)

我们可以想到一个方法,那就是先遍历数组,找到val元素的位置,然后使val之后的数据整体向前移动一位。但大家仔细想想,如果这样做的话时间复杂度就为O(N^2),因为需要嵌套for循环。

(2)时间复杂度O(N),空间复杂度O(N)

又或者我们可以这样子,我们申请一块动态内存,接着遍历数组将数组中与val不相等的元素放入这块内存中,然后得到一个不含val元素的新数组,以及这个新数组的大小,最后将新数组再赋值给原数组。此时我们的做法就是“牺牲空间,提高效率”。

那有没有办法使时间复杂度为O(N),空间复杂度为O(1)呢?答案是有的,下面是我的思路。

我的思路是:定义两个变量指向数组第一个位置,判断nums[src]是否等于val

①如果相等,src++

②如果不相等,nums[dst] = nums[src],src++,dst++

另外题中也提到,返回k个元素之外留下什么不重要(因为它们不计入内),我们只需要返回数组中前k个元素就行了,但dst是数组的下标,则我们需要+1,所以我们这个做法是可以的。接下来就是将这张图片用代码实现出来。

我们先点击运行看看调试有没有问题,调试没问题后我们再点击提交,显示通过才证明我们做对了这道题。

删除有序数组中的重复项

还是一样,我们先根据题目描述和示例构造一个框架,大家也可以先想一想怎么做(做的时候最好画图,因为图能更好地理解)。

接下来我就直接讲我的思路了

我的思路是:定义两个指针,dst指向数组第一个位置,src指向下一个位置,判断src和dst位置的数据

① 相等,src++

② 不相等,dst++,nums[dst] = nums[src],src++

接下来就是将这张图片用代码实现

我们依旧先点击运行看看调试有没有问题,调试没问题后我们再点击提交,显示通过才证明我们做对了这道题。

合并两个有序数组

还是一样,我们先根据题目描述和示例构造一个框架,大家也可以先想一想怎么做(做的时候最好画图,因为图能更好地理解)。

接下来我也直接讲我的思路

我的思路是:创建三个指针,分别指向nums1最后一个有效数据位置,nums2最后一个有效数据位置,nums1最后一个位置。然后比较l1和l2位置的数据,谁大谁就往l3位置放数据。

接下来又是用代码实现这张图

我们依旧先点击运行看看调试有没有问题,调试没问题后我们再点击提交,显示通过才证明我们做对了这道题。

本篇文章到这就结束啦,希望能够通过这三道顺序表算法题对大家有所帮助,另外对于这几道题有其他的想法也可以发到讨论区大家探讨一下。这三道题还是希望大家可以自己画图感受一下,因为单纯看我的图帮助并不大,学数据结构与算法最核心思想就是多画图,死磕代码,如果文章有说错或者说的不好的地方,请各位大佬多多指教!下篇文章见啦,希望大家多多来支持一下!

标签:src,顺序,val,dst,复杂度,算法,数组,我们
From: https://blog.csdn.net/2402_84433929/article/details/143983487

相关文章