已知长度为n的线性表A采用顺序存储结构,请写一个时间复杂度为O(n)、空间复杂度为O(1)的算法,该算法可删除线性表中所有值为item的数据元素。
#include "stdio.h"
#include "malloc.h"
#include "stdlib.h"
typedef int dataType;
typedef struct {
int data[100];//数据
int length;//长度
}SeqList;
SeqList *init();
void fill(SeqList *L);
void show(SeqList *L);
void delSeqList(SeqList *L,int i);
void destorylist(SeqList *L);
//主函数
int main(){
SeqList *L;
int e;
L=init();
fill(L);
show(L);
printf("\n你要进行删除的数据的值为:");
scanf("%d",&e);
printf("进行删除表中所有值位%d的数据\n",e);
delSeqList(L,e);
show(L);
destorylist(L);
}
//初始化表格
SeqList *init()
{
SeqList *L;
//申请空间
L=(SeqList *)malloc(sizeof(SeqList));
//长度为0
L->length=0;
return L;
}
//内容填充
void fill(SeqList *L)
{
int i=0;
printf("以下开始填充内容\n");
printf("数组的数量:");
scanf("%d",&L->length);
while(i<L->length)
{
printf("第【%d】位:",i);
scanf("%d",&L->data[i]);
i++;
}
}
//展示表格
void show(SeqList *L)
{
int i;
//依次展示数组内容
for(i=0;i<L->length;i++)
printf("第[%d]位为%d ",i,L->data[i]);
}
//销毁表
void destorylist(SeqList *L)
{
free(L);//释放空间
}
//删除所有值为e的数据
void delSeqList(SeqList *L,int e)
{
int j = 0,i=0;
for(; i<L->length;i++)
{
//如果不等于就按顺序排下去,等于就不执行
if(L->data[i] != e)
{
L->data[j] = L->data[i];
j++;
}
}
L->length = j;
}
时间复杂度为O(n):说明只能用依次循环。
O(1)是最低的空间复杂度,也就是耗耗空间与输入数据大小无关,无论输入数据增大多少倍,耗时/耗空间都不变。 表示该程序所占用的空间和所用数据量无关。
空间复杂度:一个算法在运行过程中临时占用的存储空间的度量。
代码思路:
原本是想先寻找目标值,将数组依次向前覆盖,但发现如果有多个跟目标值一样的数,算法会出错。后来进行更改,发现完善之后,算法的时间复杂度会是O(n2)。
然后就想到把不是目标值的数,全部重新排到数组中,去除目标值,时间复杂度便成为了O(n)。
输出
输入
6
2
3
2
6
2
5
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了