数据结构 —— 线性表的所有操作(看完之后408必120+)(2)

带你做一下王道上面的部分题型

为了屏幕前的你着想,那就给你把题抄上,就为了能得到您的一个赞,呜呜呜。。孩子太可怜了😭
来个简单的试试吧!

简单小题目

01 将最小值元素在顺序表中删除并且返回被删除元素的值,并将最后的元素填补进去,若顺序表为空的话,就要显示Result Error,并退出运行。
解答思想:
首先我们要先找到最小值然后再进行删除,这个题目没有时间复杂度要求,对于非大佬神仙类学生,时间有限,暴力出奇迹吧!
找到它并且删除它。

bool deleteElemet(SqList &L, ElemType &e)
{
	//删除L中最小值元素的节点,用e返回
	if(L.length==0)
	{
		printf("Result Error! ");
		return false;					//顺序表为空,中止返回
	}
	e=L.data[0];		//初始化赋值min
	int flag=0;
	for(int i=0;i<L.length;i++) //王道书上那种对于只有一个元素的顺序表直接崩溃
	{
		if(L.data[i]<=min)					//找到最小值定为min
		{
			flag=i;						//标记删除位置
			e=L.data[i];
		}
	}
	L.data[flag]=L.data[L.length-1];//把最后一个元素填不进去
	L.length--;
	return true;
}

来个大题

2020真题
 定义三元组(a, b, c)(其中a, b, c均为正数)的距离D=|a-b| + |b-c| + |c-a|。给定三个非空整数集合S1、S2和S3,按升序分别存储在3个数组中。设计一个尽可能高效的算法,计算并输出所有可能的三元组(a, b, c)(a∈S1, b∈S2, c∈S3)中的最小距离。要求:
 (1)给出算法的基本设计思想。
 (2)根据设计思想,采用 C 或 C++语言描述算法,关键之处给出注释。
 (3)说明你所设计算法的时间复杂度和空间复杂度。

解答思想:
(1)
注:问设计思想,分步写答案,抓关键字→(集合,数组)==>顺序表/队列,注意出题人给你的线索(正数,距离)
①扫描三个顺序表S1,S2,S3,将三个顺序表中的非正数删除。
②初始化D_min(a=S1[0],b=S2[0],c=S3[0],i,j,k为S1,S2,S3的序数)代入距离D最短距离然后计算S1[i]、S2[j]、S3[k]之间的D。
③若D<D_min,D_min=D。
④i,j,k下标依次加1,即固定i变化j,然后固定j变化k,计算D。
⑤输出结果D_min。

(2)算法实现


int abs(int a,int b)
{//计算绝对值。
	int sum=0;
	if(a-b<0)
	{m_
		sum=b-a;
	}
	else
	{
		sum =a-b;
	}
	return sum;
}
//王道书里明确要求是a,b,c是正数,所以我们要改一下表
int*  S_tripper(int S[],l)
{
	for(int i=0;i<l;i++)
	{
		if(S[i]<=0)
		{
			ListDelete(&S,int i,int S[i]);
		}
		else
			return S;
	}
int length(int S[],int l)
{
	for(int i=0;i<l;i++)
	{
		if(S[i]<=0)
		{
			l--;
		}
	}
	return l;
}

bool check(int a,int b,int c)
{
	if(a<=b&&a<=c)
		return true;
	else
		return false;
}
	
int findmin_D(int S1[],int l1,int S2[],int l2,int S3[],int l3)
{
	int i=0,j=0,k=0,D=0;
	int L1=0.L2=0,L3=0;
	L1=length(S,l);
	L2=length(S2,l2);
	L3=length(S3,l3);
	int min=S1[0]+S2[0]+S3[0];
	S1=S_tripper(S1,l1);
	S2=S_tripper(S2,l2);
	S3=S_tripper(S3,l3);
	while(i<L1&&j<L2&&k<L3&&min>0)
	{
		D=abs(S1[i],S2[j])+abs(S2[j],S3[k])+abs(S1[i],S3[k]);//计算D
		if(D<min)min =D;														  //更新D
		if(check(S1[i],S2[j],S3[k])) i++;								  //更新a
		else if(check(S2[j],S3[k],S1[i]))j++;							//更新b
		else k++;																	//更新c			
	}
	return min;
}

(3)
计算时间复杂度 n=(|S1|+|S2|+|S3|),为O(n),空间复杂度为O(1)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

炼丹小白师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值