【快乐手撕LeetCode题解系列】——移除元素
【快乐手撕LeetCode题解系列】——移除元素!
哈喽,各位CSDN的小伙伴们!今天小梦要和大家聊一聊一个常见的编程问题——“移除元素”。这个问题看起来简单,但是深入思考后你会发现它背后还有不少学问呢!让我带着大家一探究竟,说不定还能帮助你在算法题中更快更高效地解决问题哦!😊
---
1. 移除元素,你该怎么想?
题目说的是,给定一个数组和一个值,你需要在原数组中移除所有等于这个值的元素,最后返回移除后数组的长度。听起来不难,但怎么写才能既高效又优雅呢?
# 为什么不能用暴力法?
第一反应是不是一个个遍历数组,找到等于目标值的元素,然后把后面的元素往前移?比如说,假设数组是[1,2,3,2,4],要移除2,你可能会想到:
`c
找到第一个2后,把后面的元素往前移,变成[1,3,2,4],然后继续找下一个2,再移一次,得到[1,3,4]。
`
但这样做有个问题:时间复杂度太高了,是O(n²)。对于大数组来说,会慢得让人抓狂!所以,我们需要更聪明的办法。🙃
# 双指针法,了解一下?
这个时候,双指针法就派上用场了!一个指针指向当前要处理的位置(dst),另一个指针遍历数组(src)。
具体来说,当nums[src]等于目标值时,src往后走一步;如果nums[src]不等于目标值,就把这个值赋值到nums[dst],然后两个指针都往后走一步。最后,dst的值就是移除后数组的长度。这个方法时间复杂度是O(n),空间复杂度是O(1),简直是完美!
举个例子,假设数组是[1,2,3,2,4],目标值是2,双指针这么操作:
`
初始化 dst=0, src=0。
src=0时,nums[src]=1,不等于2,把它赋值给nums[dst=0],然后dst=1,src=1。
src=1时,nums[src]=2,等于目标值,src=2。
src=2时,nums[src]=3,不等于2,赋值给nums[dst=1]=3,然后dst=2,src=3。
src=3时,nums[src]=2,等于目标值,src=4。
src=4时,nums[src]=4,不等于2,赋值给nums[dst=2]=4,然后dst=3,src=5。
循环结束,返回dst=3。新的数组是[1,3,4]。
`
是不是超简单?代码也是短小精悍哦!
---
2. 总结撒花!
通过今天的分享,大家是不是觉得双指针法超级有用?它不仅仅适用于移除元素的问题,还能解决很多类似的数组处理问题呢!
如果想更深入地理解双指针法,可以尝试一下其他类似的题目,比如“合并两个有序数组”或者“删除排序数组中的重复项”。多练习,自然熟能生巧!😍
欢迎在评论区留言,一起讨论哦!如果觉得这篇内容对你有帮助,别忘了点赞和关注,小梦会继续为大家带来更多有趣的内容!感谢大家的支持,我们下次再见!💞
【快乐手撕LeetCode题解系列】——移除元素😎
- 前言🙌
-
- 移除元素🙌
-
- 解题思路分析 😍
- 解题思路一 :源代码分享:😍
- 程序输出结果验证:😊
- 总结撒花💞
😎博客昵称:博客小梦
😊最喜欢的座右铭:全神贯注的上吧!!!
😊作者简介:一名热爱C/C++,算法等技术、喜爱运动、热爱K歌、敢于追梦的小博主!
😘博主小留言:哈喽!😄各位CSDN的uu们,我是你的博客好友小梦,希望我的文章可以给您带来一定的帮助,话不多说,文章推上!欢迎大家在评论区唠嗑指正,觉得好的话别忘了一键三连哦!😘
前言🙌
哈喽各位友友们😊,我今天又学到了很多有趣的知识,现在迫不及待的想和大家分享一下!😘我仅已此文,和大家分享【快乐手撕LeetCode题解系列】——移除元素~ 都是精华内容,可不要错过哟!!!😍😍😍
移除元素🙌
题目描述:
解题思路分析 😍
(1)画图分析:
(2)文字讲解
- 第一种思路,就是覆盖删除。遍历这个数组,找到每一个val值,然后移动后面的元素进行覆盖删除。这种算法的时间复杂度是O(n^2),空间复杂度为O(1)。在个题目跑不过去,太慢了
- 第二种思路是,新建立一个数组,将不是val的值存放到新的数组当中。然后放回新数组的元素个数即可。时间复杂度是O(n),空间复杂度是O(n)。
- 第三种思路,利用双指针(双下标)。当src指向的数组元素等于val时,只让src++即可。如果不等于val,则让src的值赋值给dst位置的元素,然后让dst和src都往后走一步即可。这个算法的时间复杂度是O(n),空间复杂度是O(1)
解题思路一 :源代码分享:😍
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;
}
程序输出结果验证:😊
总结撒花💞
本篇文章旨在分享【快乐手撕LeetCode题解系列】——移除元素。希望大家通过阅读此文有所收获!😘如果我写的有什么不好之处,请在文章下方给出你宝贵的意见😊。如果觉得我写的好的话请点个赞赞和关注哦~😘😘😘