【C语言】Leetcode 27.移除元素
一、代码实现
如果不考虑O(1)的空间复杂度的话我们可以再创建数组来进行遍历解决该问题,但是在要求之下该做法无法通过。于是我们可以用双指针来解决,最坏的情况时间复杂度为O(N)。
int removeElement(int* nums, int numsSize, int val) {
int src = 0; // 定义源指针src,用于遍历原始数组
int dst = 0; // 定义目标指针dst,用于指向新数组中的位置
while(src < numsSize) { // 循环遍历源数组
if(nums[src] != val) { // 如果源数组当前位置的值不等于目标值val
nums[dst++] = nums[src++]; // 将当前值复制到目标数组中,并分别递增源指针和目标指针
} else {
++src; // 如果源数组当前位置的值等于目标值val,则只递增源指针,不将该值复制到目标数组中
}
}
return dst; // 返回新数组的长度
}
以上代码的主要思路是使用两个指针
src
和dst
,其中src
指向原始数组中的元素,而dst
指向新数组中的位置。当src
指向的元素不等于目标值val
时,将该元素复制到新数组中,并递增dst
和src
指针;当src
指向的元素等于目标值val
时,只递增src
指针,不进行复制操作。最终返回dst
作为新数组的长度。
这段代码的时间复杂度为O(n),其中n为原始数组的长度。由于只遍历一次原始数组,因此效率较高。
二、算法图解
我们设置2为val,src和dst为两个指针。
2 | 1 | 2 | 4 | 3 | 1 |
我们先让两个指针指向数组第一个元素。
由于2是val,所以src++,变成了如下。
1不是val,所以dst指向的2赋值为src所指向的元素,结果如下图。
如此类推当到了下一个val的时候再次将dst赋值给src。
最终得到的就是dst指针所指向之前的数组元素,返回的数组大小为dst。
本文来自博客园,作者:KevinBee,转载请注明原文链接:https://www.cnblogs.com/kevinbee/p/18678282
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)