链表相关其他算法题2|排序插入节点|按数据类型拆分链表|输出次数最多的前k个词|三个链表公共元素|两个整数数位求和(C)

C++ 知识补充 向量(vector)是一个封装了动态大小数组的顺序容器(SequenceContainer)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。C++中map提供的是一种键值对容器,里面的数据都是成对出现的,如下图:每一对中的第一个值称之为关键字(key),每个关键字只能在map中出现一次;第二个称之为该关键字的对应值。 阅读详情

排序插入节点

设民航公司有一个自动预订飞机票的系统,该系统中有一张用双重链表示的乘客表,表中节点按乘客姓氏的字母序相连
为该系统写一个当任意乘客订票时修改乘客表的算法

算法思想

av是可用数组空间的最小下标

typedef struct Node
{
	char data[maxsize];
	int prev, next;
}unode;

void Insert(unode user[max], int av)
{
	// 读入字符串s,是乘客的姓名
	scanf("%s", s);
	// 将字符串s的内容拷贝到新的节点的数据域
	strcopy(user[av].data, s);
	// 创建工作指针cur
	cur = 1;
	
	if (strcmp(user[cur].data, s) < 0)
	{
		// 沿右链查找
		while (cur && strcmp(user[cur].data, s) < 0)
		{
			unode prev = cur;
			cur = user[cur].next;
		}
		user[av].next = cur;
		user[av].prev = prev;
		// 将新节点链入表中
		user[prev].next = av;
		user[cur].prev = av;
	}
	else
	{
		while (cur && strcmp(user[cur].data ,s) > 0)
		{
			unode prev = cur;
			cur = user[cur].next;
		}
		user[av].next = prev;
		user[av].prev = cur;
		// 将新节点链入表中
		user[prev].prev = av;
		user[prev].next = av;
	}
}

按数据类型拆分链表

已知L为没有头节点的单链表中第一个节点的指针,每个节点数据域存放一个字符,该字符可能是英文字母字符或数字字符或其他字符
构造三个以带头节点的单循环链表表示的线性表,是每个表中只含有同一类字符

算法思想

首先要构造含有这三类字符的表头节点
然后从原链表的第一个节点开始,根据数据域的类型分别插入到三个链表之一
采用前插法

void OneToThree(LinkList &L, &l1, &l2, &l3)
{
	l1 = (LinkList)malloc(sizeof(LNode));
	l2 = (LinkList)malloc(sizeof(LNode));
	l3 = (LinkList)malloc(sizeof(LNode));
	l1->next = l1, l2->next = l2, l3->next = l3;

	LNode* cur = L, *next;
	while (cur)
	{
		next = cur->next;
		if (cur->data >= 'a' && cur->data <= 'z' || cur->data >= 'A' && cur->data <= 'Z')
		{
			cur->next = l1->next;
			l1->next = cur;
		}
		else if (cur->data >= '0' && cur->data <= '9')
		{
			cur->next = l2->next;
			l2->next = cur;
		}
		else
		{
			cur->next = l3->next;
			l3->next = cur;
		}
		cur = next;
	}
}

输出次数最多的前k个词

设键盘输入n个英语单词,输入格式为n,w1,w2,…wn,其中n表示随后输入英语单词的个数
建立一个单向链表,实现

  1. 如果单词重复出现,只在链表中保留一个
  2. 有一个计数域,记录该单词重复的次数,然后输出出现次数最多的前k个单词
算法思想

用字符数组表示英文单词,判断单词是否相等,使用strcmp函数

typedef struct Node
{
	// 频度域
	int freq;
	char word[maxsize];
	struct Node* next;
}LNode, *LinkList;

LinkList Create()
{
	LinkList L;
	// 申请头节点
	L = (LinkList)malloc(sizeof(LNode));
	// 链表初始化
	L->next = NULL;

	// 建立n个节点的链表
	for (i = 1; i <= n; i++)
	{
		scamf("%s", s);
		// cur是工作指针,prev是前驱指针
		LNode* cur = L->next;
		LNode* prev;
		while (cur)
		{
			if (strcmp(cur->data, s) == 0)
			{
				cur->freq++;
				break;
			}
			else
			{
				// 指针后移
				prev = cur;
				cur = cur->next;
			}
		}
		// 该词没出现过,插入链表
		if (cur == NULL)
		{
			cur = (LinkList)malloc(sizeof(LNode));
			strcopy(cur->data, s);
			cur->freq = 1;
			cur->next = NULL;
			prev->next = cur;
		}
	}
	return L;
}

void CreatOut()
{
	LinkList L;
	L = (LinkList)malloc(sizeof(LNode));
	L->next = NULL;

	for (i = 1; i <= n; i++)
	{
		scanf("%s", s);
		LNode* cur = L->next;
		LNode* prev = cur;
		while (cur)
		{
			if (strcmp(cur->data, s) == 0)
			{
				// 重复出现,频度+1
				cur->freq++;
				prev->next = cur->next;
				prev = L;
				LNode* cur2 = L->next;
				while (cur2->freq > cur->freq)
				{
					prev = cur2;
					cur2 = cur2->next;
				}
				prev->next = cur;
				cur->next = cur2;
			}
			else
			{
				prev = cur;
				cur = cur->next;
			}
		}
		if (cur == NULL)
		{
			cur = (LinkList)malloc(sizeof(LNode));
			strcopy(cur->data, s);
			cur->freq = 1;
			cur->next = NULL;
			prev->next = cur;
		}
	}
	int k, i = 0;
	scanf("输入要输出单词的个数%d", &k);
	cur = L->next;
	// 输出频度最高的k个单词
	while (cur && i < k)
	{
		printf("第%3d个单词%s出现%3d次\n", ++i, cur->data, cur->freq);
		cur = cur->next;
	}
}

三个链表公共元素

已知三个带头节点的线性链表A、B和C,节点均从小到大非递减次序排列
对A表,使A链表仅留下三个表中均包含的数据元素的节点,且没有值相同的节点,并释放所有无用的节点
m,n,p表示链表长度

算法思想

首先查找A和B的公共数据,再去C中找有无该数据,要消除重复元素,要保存前驱

LinkList Common(LinkList &A, &B, &C)
{
	LNode* cur1 = A->next, *cur2 = B->next, *cur3 = C->next;
	// prev是A表中当前节点的前驱指针
	LNode* prev = A;
	// ABC均不为空时,查找共同元素
	while (cur1 && cur2 && cur3)
	{
		while (cur1 && cur2)
		{
			// A表的值小于B表,删去这个节点
			if (cur1->data < cur2->data)
			{
				LNode* del = cur1;
				cur1 = cur1->next;
				free(del);
			}
			// A表的值大于B表,B表指针后移
			else if (cur1->data > cur2->data)
			{
				cur2 = cur2->next;
			}
			else if (cur1 && cur2)
			{
				// 判断C表,当C表指针的数据小于A表,C表后移
				while (cur3 && cur3->data < cur1->data)
				{
					cur3 = cur3->next;
				}
				if (cur3)
				{
					// C表数据大于A表,删除A表节点
					if (cur3->data > cur1->data)
					{
						LNode* del = cur1;
						cur1 = cur1->next;
						free(del);
					}
					// 值相等
					else
					{
						// 如果cur1是第一个节点
						if (prev == A)
						{
							prev->next = cur1;
							prev = cur1;
							cur1 = cur1->next;
						}
						// 如果是重复节点,不链入A表
						else if (prev->data == cur1->data)
						{
							LNode* del = cur1;
							cur1 = cur1->next;
							free(del);
						}
						else
						{
							prev->next = cur1;
							prev = cur1;
							cur1 = cur1->next;
						}
					}
				}
			// 链表的工作指针后移
			cur2 = cur2->next;
			cur3 = cur3->next;	
			}
		}
	}
	// A表到尾,尾置空
	if (cur1 == NULL)
		prev->next = NULL;
	// A表未到尾,删除剩余元素
	else
	{
		prev->next = NULL;
		while (cur1)
		{
			LNode* del = cur1;
			cur1 = cur1->next;
			free(del);
		}
	}
}

两个整数数位求和

给定两个用链表表示的整数,每个节点表示一个数位,这些数位是反向存放的,也就是个位排在链表首部
对这两个整数求和,用链表形式返回结果

算法思想

设置carry为当前递归的进位信号,
如果两个链表均不为空。则以L1为根节点,更新其值,并让该节点的next节点(高位数节点)为下次递归返回值,再返回当前节点作为上一个节点(低位节点)的next节点,
如果有一个链表为空,这里假设L2为空,如果递归时,低位节点不存在进位情况,则直接返回L1即可,如果存在进位,就更新L1节点值,并且如果更新L1节点值导致还需要继续进位,则继续递归下去
如果链表全为空,如果此时还需要进位,就返回一个开辟的值位L的新节点,如果不需要进位,直接返回空指针

LinkList addTwoNumbers(LinkList L1, LinkList L2)
{
	// // 如果两个链表都是空的,返回空
	if (L1 == NULL && L2 == NULL)
		return NULL;
	// 如果链表1为空,直接返回链表2
	if (L1 == NULL)
		return L2;
	// 如果链表2为空,直接返回链表1
	if (L2 == NULL)
		return L1;

	// 初始化两个链表的当前节点指针cur1, cur2,和返回链表的头尾指针
	LNode* cur1 = L1, *cur2 = L2, *head = NULL, *tail = NULL;
	// 临时变量,用来保存当前的进位
	int tmp = 0;
	while (cur1 && cur2)
	{
		// 创建新节点保存当前的计算结果
		LNode* ret = (LinkList)malloc(sizeof(LNode));
		// 当前节点的值是两个链表对应节点的和加上进位(tmp)
		ret->data = (cur1->data + cur2->data + tmp) % 10;
		// 如果头节点为空,表示链表为空,设置头尾指针
		if (head == NULL)
		{
			tail = ret;
			head = tail;
		}
		else
		{
			// 如果链表非空,将新节点添加到尾部
			tail->next = ret;
			tail = ret;
		}
		// 计算新的进位
		tmp = (cur1->data + cur2->data + tmp) / 10;
		// 移动到下一个节点
		cur1 = cur1->next;
		cur2 = cur2->next;
	}
	// 如果L2链表长于L1链表,处理L2剩余部分
	if (cur2)
	{
		// 将cur1指向cur2,继续处理
		cur1 = cur2;
	}
	// 处理L1剩余部分
	while (cur1)
	{
		// 创建新节点保存当前的计算结果
		LNode* ret = (LinkList)malloc(sizeof(LNode));
		// 当前节点的值是L1当前节点的值加上进位(tmp)
		ret->data = (cur1->data + tmp) % 10;
		// 更新进位
		tmp = (cur1->val + tmp) / 10;
		// 移动到下一个节点
		cur1 = cur1->next;
		// 将新节点添加到尾部
		tail->next = ret;
		tail = ret;
	}
	// 如果有剩余进位,添加一个新节点表示进位
	if (tmp)
	{
		// 创建新节点保存进位
		LNode* ret = (LinkList)malloc(sizeof(LNode));
		ret->data = tmp;
		// 将进位节点添加到尾部
		tail->next = ret;
		tail = ret;
	}
	// 最后将尾节点的next指针置为空,表示链表结束
	tail->next = NULL;
	// 返回链表的头节点
	reeturn head;
}
【信息科学与工程学】计算机科学与自动化——第十八篇 存储系统设计 10 存储器/存储软件/存储芯片/存储盘/存储系统/存储网络01 ③ MTJ电阻 → 界面:TMR=(R_AP-R_P)/R_P = 2P₁P₂/(1-P₁P₂) (Julliere模型);③ 访问延迟模型 → 统计:平均访问延迟 = p_hot * t_dram + (1-p_hot) * t_nvm + t_migration_overhead;:① 储能电容计算 → 数学物理:所需能量 E = P * t_backup,电容 C = 2E / (V_start² - V_end²);:① B-tree平衡 → 代数:树高 h = log_m(N),m为扇出; 阅读详情

相关推荐

【信息科学与工程学】计算机科学与自动化——第三百零五篇 计算机系统中的各类运算操作01

编号类型领域运算操作运算类型算法算法的详细设计及数学分析参数列表及参数的数值设计应用场景 (100+条)集合运算​1集合运算关系代数并集 (Union)集合运算归并排序去重合并两个集合,去除重复元素。时间复杂度 O(n+m),n,m为两集合大小。输入:集合A, B。输出:A∪B。数据集成、多表结果合并、去重后的全量数据提取。2集合运算关系代数交集 (Intersection)集合运算哈希交集找出同时属于两个集合的元素。平均时间复杂度 O(min(n,m)),最坏 O(n*m)。输入:集合A, B。输出:A∩

weixin_49199313的博客 1388

9.18dance

1.字符串a包含串b吗 https://wizardforcel.gitbooks.io/the-art-of-programming-by-july/content/01.02.html https://zhuanlan.zhihu.com/p/61331821 2.最长无重复字符的子串 https://www.cnblogs.com/grandyang/p/4480780.html 3.头条面...

acttell的博客 1040

【信息科学与工程学】计算机科学与自动化——第一百八十九篇 计算机硬件 系列一 微处理器01

在金融行业CDN流推送场景中,结合WebRTC over SD-RTN与SD-WAN Branch方案,需兼顾​​要求。

weixin_49199313的博客 1056

数据结构、常用算法、Java常用集合类、数据类型

常用数据结构及算法

mix39的博客 378

5个4000比特大状态置换算法的设计与分析

下面是 5 个概念性、实验性的 4000 位可逆置换设计。它们都保证是双射,但未经过密码分析,不可直接用于生产系统。风格分别覆盖:三维 SPN、Feistel、可逆元胞自动机、ARX、宽轨迹/Keccak 式结构。 这 5 个设计分别代表了 SPN、Feistel、元胞自动机、ARX、宽轨迹 Keccak 五种不同风格,覆盖了主流大状态置换的构造思路。再次强调:它们只是实验性概念,若要用于实际协议,必须经过严格安全性分析。

HuangJinLong2的博客 344

保姆级教程:用YOLOv5s搞定钢材表面缺陷检测,从数据集NEU-DET到模型部署全流程

本文提供了一份详细的YOLOv5s钢材表面缺陷检测教程,涵盖从NEU-DET数据集处理到模型部署的全流程。针对工业环境中的实际限制,如计算资源有限和标注样本少等问题,提供了优化方案和实用技巧,帮助开发者快速实现高效的钢材缺陷检测系统。

weixin_30568591的博客 464

每周技术面试高频题汇总:大厂面试官到底在考什么?完整实战指南

大家好,又到了每周的面试复盘时间。。现在的面试官更喜欢把你扔进一个具体的“场景”里,看你怎么思考、怎么权衡(Trade-off)。基于过去一周 优快云、掘金、LeetCode 等社区的热议内容,我为大家精选了,涵盖算法、系统设计、数据库和网络四大领域。咱们不整那些虚的,直接上干货,看看这些题目背后的考察点和解题思路。

热爱技术与前沿创新,深耕科技领域,在科创中精进自我;探索技术乐趣,分享技术干货与成长心得,以技术为伴,热爱生活,在科创与生活中双向成长。 482

SenseVoice 实测,阿里开源语音大模型,识别效果和效率优于 Whisper,居然还能检测掌声、笑声!5分钟带你部署体验

阿里开源语音大模型:语音识别效果和性能强于 Whisper,还能检测掌声、笑声、咳嗽等

u010522887的专栏 4万+

力扣OJ(2601-3000)

。。。

nameofcsdn的博客 1501

ANSYS命令流黑箱揭秘:流体渗透压力载荷的七种收敛优化策略

本文深入解析ANSYS Workbench中流体渗透压力载荷的七种收敛优化策略,重点探讨接触探测点迭代逻辑、PPCN阈值动态调整及FPAT参数优化等关键技术。通过命令流示例和实战技巧,帮助工程师有效解决流体与结构相互作用仿真中的收敛难题,提升计算效率和精度。

weixin_29274337的博客 520

解读区块链在制药和物流管理中具备的优势

供应链透明度是建立药品弹性供应链的关键,如何更好地促进端到端的透明度,促进合作伙伴和消费者之间的信任度是当前医药和物流行业高管们关注的话题,区块链技术可以很好的帮助他们。 链集市 · 让区块链落地更简单 《区块链行业观察》专栏·第 31 篇 作者丨Shams Rahman 图片丨来源于网络 作者介绍:本文作者为Shams Rahman教授,是RMIT大学商业IT和物流学院的供应链管理教授、研究与创新部门副主任。本文中文版本由链集市团队编译整理,英文版权归原作者所有,中文转载请联系编译。 新冠肺炎疫情的爆发

CECBC的博客 623

嵌软编程刷题记录

并且活动主持人需要全程参与活动,换句话说,一个主持人参与了第 i 个活动,那么该主持人在 (有 n 个活动即将举办,每个活动都有开始时间与活动的结束时间,第 i 个活动的开始时间是。求为了成功举办这 n 个活动,最少需要多少名主持人。2. 任意两个相邻的孩子之间,得分较多的孩子必须拿多一些糖果。复杂度要求:时间复杂度O(nlogn) ,空间复杂度 O(n)要求: 时间复杂度为O(n) 空间复杂度为 O(n),举办某个活动就需要为该活动准备一个活动主持人。输入:2,[[1,2],[2,3]]

2302_79514441的博客 370

自抗扰控制(ADRC)理论与工程实践:8.2 模糊ADRC、神经网络ADRC等智能融合变体

智能融合ADRC变体概述 自抗扰控制(ADRC)与智能控制方法(如模糊逻辑、神经网络)的融合,旨在突破传统ADRC在非线性、时变系统中的应用局限。智能融合ADRC主要通过以下方式实现性能提升: 模糊ADRC 参数自整定:利用模糊推理在线调节ADRC带宽参数,实现自适应控制。 非线性反馈:用模糊控制器替代线性PD,灵活设计非线性控制策略。 优势:融入专家经验,无需精确模型;局限:依赖规则库设计,稳定性分析困难。 神经网络ADRC 增强ESO:用神经网络学习扰动动态,提高估计精度。

技术工作者 225

Leno 语言入门指南

《Leno语言入门指南》摘要 Leno是一门介于Python和Go之间的静态类型检查脚本语言,融合了动态语言的灵活性和静态类型的安全性。该指南全面介绍了Leno的核心特性: 基础语法:支持类型推断(var)、任意精度整数、并行赋值和代码块作用域 类型系统:包含int(自动处理溢出)、float、string、bool等基础类型,以及泛型数组和字典 控制流:提供if/switch条件语句、多种for循环形式以及类型守卫功能 函数编程:支持高阶函数、匿名函数、闭包和默认参数 面向对象:通过struct实现,包含

cheng8214的专栏 312

饥饿游戏搜索算法(HGS)详解:从生物激励到智能优化

饥饿游戏搜索算法(HGS)是一种受动物饥饿驱动觅食行为启发的智能优化算法。该算法通过模拟生物饥饿程度与觅食策略的关系,将个体适应度映射为饥饿感,并据此动态调整搜索行为。HGS的核心机制包括:1) 饥饿权重计算(W1/W2),2) 三种位置更新策略(随机探索、正向/负向协作),3) 自适应平衡参数E。算法通过迭代优化逐步改进解的质量,具有参数自适应、全局搜索能力强等特点,在复杂优化问题中表现出色。相比传统优化方法,HGS更注重个体内部状态对搜索行为的影响,实现了探索与开发的自然平衡。

qq_42212808的博客 154

小程序设计中的区块链应用:数字藏品实现

本文旨在为开发者提供在小程序中实现区块链数字藏品功能的完整技术方案。区块链与数字藏品的基础概念智能合约的设计与实现小程序与区块链的交互方式数字藏品的完整实现流程文章将从基础概念入手,逐步深入到技术实现层面,最后通过完整项目案例展示数字藏品在小程序中的实现方式。每个技术点都会配合代码示例和架构图进行说明。区块链:一种分布式数据库技术,通过加密算法保证数据不可篡改数字藏品:基于区块链技术的数字资产,具有唯一性和可验证性NFT。

小程序开发 1350

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 170

直流母线电压采集与缓冲调理电路

本文介绍了一种直流母线电压采集与缓冲调理电路的设计与应用。该电路通过电阻分压网络将高压直流母线电压降至适合ADC采样的范围,并采用运放电压跟随器实现高输入阻抗和低输出阻抗的缓冲功能,有效提高采样精度和抗干扰能力。文章重点阐述了低输出阻抗对驱动负载、抗干扰和电压稳定的重要性,并列举了该电路在工业电源监测、电动汽车BMS、通信电源和储能系统等领域的典型应用场景。

qq_37999850的博客 316

【算法拾光】链表 哈希表|K个一组翻转链表 + 两数之和

K个一组翻转链表需分段反转,借助哑节点与前驱指针维护连接,避免断链;两数之和利用哈希表实现O(1)查找,空间换时间,高效定位目标组合。前者考察链表指针操作,后者聚焦映射关系构建,均为面试高频题。

wuqingyigexiaoba的博客 270

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

排序算法深度笔记(下):非比较类排序的线性突破与工程边界

排序算法时间复杂度额外空间复杂度稳定性是否基于比较选择排序O(N^2)(O(1))不稳定是冒泡排序O(N^2)(O(1))稳定是插入排序O(N^2)(O(1))稳定是归并排序O(N\log N)(O(N))稳定是快速排序O(N\log N)O(log N)不稳定是堆排序O(N\log N)O(1)不稳定是计数排序(O(N + M))O(M))稳定否基数排序O(N)稳定否桶排序平均O(N) / 最坏O(N^2)

2401_87069538的博客 553

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

算法日常・每日刷题--<动态规划>42

本题为“不相交的线”,与最长公共子序列问题相似。使用动态规划求解:定义 dp[i][j] 表示 nums1[0:i] 与 nums2[0:j] 的最大不相交连线数。若元素相等,则继承左上值加1;否则取上方或左方最大值。最终返回 dp[m][n],即两数组的最大不相交连线数。时间复杂度 O(mn),空间复杂度 O(mn)。

2503_92261635的博客 17

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

C语言程序设计题|有序数组插入数字冒泡排序

题目要求将一个数插入有序数组末尾,并用冒泡排序实现整体升序。代码先将输入数存入数组最后位置,再通过双重循环进行冒泡排序,每轮将较大元素向后移动,最终输出11个升序元素。该方法虽时间复杂度为O(n²),但符合题目要求,逻辑清晰,适合初学者理解排序原理。

2301_81429079的博客 643

【算法拾光】模拟|外观数列 + 数青蛙

本文总结两道模拟题解法:外观数列通过迭代统计连续数字个数生成下一项,关键在于处理末尾字符;数青蛙则模拟青蛙叫声“croak”状态转移,维护各阶段青蛙数量,记录最大并发数并确保全部完成。共性在于严格遵循流程、细致处理边界与非法情况,锻炼字符串遍历与状态管理能力。

wuqingyigexiaoba的博客 367

牛客周赛165C题(前后缀性质,递推,排序,枚举)

题目大意:给定长度为 `n` 的数组,选择 `k ∈ [1,n]`,将前 `k` 个元素整体翻转,后面的元素不变。要求操作后的整个数组非递减,统计满足条件的 `k` 的数量。题目链接:https://ac.nowcoder.com/acm/contest/141721/C。时间复杂度:O(nlogn)

2501_94316951的博客 156

【数据结构-3】算法美学之降复杂度

在while循环的循环体内,首先用临时变量保存最后一个位置的数据,再通过for循环把所有元素往后移动一位,最后把tmp中保存的值放到下标为0的位置上去。方法二的思路是:创建新数组,让原数组中后k个数据移动到新数组中前面的位置,让原数组中前numsSize-k个数据移动到新数组中后面的位置,这。这段代码的思路是:三次逆置,第一次逆置前numsSize-k个数据,第二次逆置后k个数据,最后整体逆置。这篇博文分享一道解法不一的算法题,求解过程的目的在于降低算法的时间复杂度,题源力扣。,属于空间换时间的操作。

weixin_44218929的博客 80

算法日常・每日刷题--<动态规划>32

给定严格递增的正整数数组,求最长斐波那契子序列长度。使用二维DP,dp[i][j]表示以arr[i]、arr[j]为最后两项的序列长度,初始化均为2。通过哈希表快速查找前一项target = arr[j] - arr[i],若存在且下标小于i,则状态转移:dp[i][j] = dp[k][i] + 1。遍历更新全局最大长度,最终若结果小于3则返回0。时间复杂度O(n²),空间复杂度O(n²)。

2503_92261635的博客 176
上一篇: 链表相关其他算法题1|按访问频度排序|求链表的最大孪生和|后半段原地逆置|找链表中间节点(C)
下一篇: 栈相关算法题1|通过栈判断链表是否对称|共享栈入栈出栈|括号匹配|多种括号配对|递归求序列最大值(C)
ChoSeitaku
博客等级 码龄5年 3452粉丝 557原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值