C 语言 数组删除指定元素(快慢指针法)

适用场景:在原数组上原地删除所有等于目标值的元素,不额外开辟新数组,时间复杂度 O (n),空间复杂度 O (1)。

核心原理:快慢双指针

  • 快指针 i :负责从头到尾遍历数组的每一个元素,逐个检查。for循环每次i++,一定会向后移动。

  • 慢指针 j :用来标记存放保留元素的位置 。只有当遍历到的元素不需要删除时,j才向后移动。

    数组: [10] [20] [40] [30] [50]
    i: →i →i →i →i →i
    j: →j →j →j j →j

目标:删除数组中所有值等于30的元素。

右侧最终保留的有效数据: 10 20 40 50

逐步骤推演

原始数组:buf = {10, 20, 40, 30, 50},初始状态 i=0,j=0

  1. i=0,buf[i]=10,不等于 30。执行buf[j++] = buf[i],buf[0]=10,j=1
  2. i=1,buf[i]=20,不等于 30。执行buf[j++] = buf[i],buf[1]=20,j=2
  3. i=2,buf[i]=40,不等于 30。执行buf[j++] = buf[i],buf[2]=40,j=3
  4. i=3,buf[i]=30,等于待删除元素。不执行赋值,j 保持为 3,原地不动
  5. i=4,buf[i]=50,不等于 30。执行buf[j++] = buf[i],buf[3]=50,j=4

循环结束。 j=4,代表删除完成之后,数组有效长度为 4。数组前j个元素就是结果:{10,20,40,50}。

重点:数组后面残留的旧数据没有被擦除,我们后续只读取数组前j项即可。

复制代码
#include <stdio.h>
#define MAX 5

int main(void)
{
    int buf[MAX] = {10,20,40,30,50};
    int i,j = 0;

    //快慢指针遍历数组
    for(i = 0; i < MAX; i++)
    {
        //当前元素不是要删除的值,则保留
        if(buf[i] != 30)
        {
            buf[j++] = buf[i];
        }
    }

    //打印删除后的有效数组,j为新数组长度
    printf("删除30之后的数组:");
    for(i = 0; i < j; i++)
    {
        printf("%d ", buf[i]);
    }
    printf("\n");
    return 0;
}

原理示意图

相关推荐
非优秀程序员9 小时前
第05章 播放器大战,暴风、快播与那一夜|《互联网产品恩仇录》
算法
沐晓时光10 小时前
C语言入门,内存函数知识讲解
c语言·开发语言
Zwawa13 小时前
C语言函数指针与宏实战:从回调、表驱动菜单到X-Macro,讲透嵌入式代码解耦
c语言·单片机·嵌入式
武子康15 小时前
驾驶轨迹换个坐标,就能给移动机器人用吗?
人工智能·算法·机器学习
David猪大卫16 小时前
【C++修炼】map 和 set 的使用
c语言·开发语言·数据结构·c++·经验分享·笔记·学习
HPtiger16 小时前
C++ 入门笔记:从 C 到 C++ 的核心过渡(命名空间、输入输出、缺省参数、重载、引用、内联)
c语言·c++·学习
vvilkim17 小时前
数据结构类型、区别与应用场景:一篇讲透选型逻辑
数据结构
安妮细水长流19 小时前
ad7124
c语言·单片机
lisw0521 小时前
Dayhoff的PAM替换矩阵理论评介!
线性代数·算法·矩阵