
C
铁废物258
这个作者很懒,什么都没留下…
展开
-
动态规划算法
动态规划例题详解原创 2022-09-20 15:28:00 · 543 阅读 · 0 评论 -
动态规划:背包问题
背包问题:有M个价值各不同的珠宝,小偷偷每个珠宝的时间也各不同,要在保安发现之前赶紧把珠宝尽可能多地装进背包,同时也必须保证背包内珠宝总价值最大设:背包大小为M[][],t时刻偷窃珠宝的价值为V[100],每个珠宝偷窃的时间为time[t]t时刻偷窃第i个珠宝,当前时间为t,则对当前珠宝进行判断,设上次偷窃完背包内价值加上本次这个珠宝价值v[i]为: m[i-1][ t-time[i] ],如果不偷窃该珠宝,则为: m[i-1][t]状态转移方程:M[i] [j]= max{ v[i]+原创 2022-04-07 00:16:24 · 813 阅读 · 0 评论 -
已知深度为k的二叉树顺序存储在BT[1:2^k-1]中,写一个非递归算法,创建二叉链表树
递归函数的执行次数#include<stdio.h>void fun(int a[], int n, int k){int i;if (k == n - 1){for (i = 0; i < n; i++){printf("%5d", a[i]);}}else{for (i = k; i < n; i++)a[i] = a[i] + ...原创 2021-01-04 01:18:36 · 487 阅读 · 0 评论 -
51单片机实现ESP8266云端通信
总结经验:要先手动配置AP+STA模式,再连入WiFi,然后波特率要同步,再接入51单片机,配置连接服务器和发送长度,最后在主程序里面发送字符串一.通过AT指令集配置ESP8266模块使用USB转串口驱动,没有的小伙伴可以用USB转TTL代替,接线时,ESP8266的RX和TX与TTL转接口的交叉,即只要接四根先,其他的不用接打开串口助手工具,打开目标串口,注意输入指令的时候在结尾回车发送1. AT+RST 2. AT+UART=9600,8,1,0,0 //波特率设为9600...原创 2021-01-03 16:18:50 · 7005 阅读 · 2 评论 -
将给定表达式树转换成等价的中缀表达式
void BiTreeToExp(BiTree *T, int deep){ if(!T){ return ; } else if(!T->lchild && !T->rchild){ print(T->data); }else{ if(deep>1){ //不为叶子结点,则运算次序需要加括号 printf("("); } BiTreeToExp(T->lchild,deep+1); //往.原创 2020-12-31 09:58:17 · 1077 阅读 · 4 评论 -
将二叉树叶子从左至右顺序链接成一个单链表
基于中序递归思想,尾插法先链接左子树,当前的结点被单链表的头节点接入,之后链接右子树ListList *L = (LinkList *)malloc(sizeof(LNode));LNode *pre = NULL; //设头节点 ,使用尾插法ListList InOrder(BiTree T){ if(T){ InOder(T->lchild); if(!T->lchild && !T->right){ if(!pre){ //头节点为空,原创 2020-12-31 09:55:35 · 1411 阅读 · 1 评论 -
判断完全二叉树
判断完全二叉树基于层序遍历的思想,判断每层遍历结束后,取出队列中的结点,判断该层的结点是否还有子结点,则为非完全二叉树。整颗树遍历结束后如果没有上述情况则为完全为二叉树原创 2020-12-31 09:51:45 · 323 阅读 · 0 评论 -
由中序和后序建立二叉树
函数传入中序与后续遍历的数组,以及各自的开始、结尾位置基于先序遍历思想建立二叉树。创建二叉树根结点,以后续的末尾元素为根结点的数值,然后从中序开始位置遍历,遇到了后续的末尾元素相同的元素则为中序遍历的根,且其左边界到根的位置为左子树的长度,其到右边界的长度为该根的右子树的长度。然后递归建立左右子树,后续结点最后一个已经赋值,所以右边界减少了一个。BiTree InToPost(ElemType In[], int l1, int h1, ElemType Post[], int l2, i原创 2020-12-30 23:40:30 · 1025 阅读 · 0 评论 -
求二叉链表树高度
非递归实现基于层序遍历思想,使用队列操作结点,从根节点开始入队,出队后判断左右子树,如果当前结点有左右子树则将子树入队,并且判断是否访问到这一层最右端结点,层数加1.void Height(BiTree T){ BiTree Q[maxsize]; //创建一个队列存储二叉树类型结点 int front =0 , rear = 0; //初始化队列的队头与队尾 int last=0, level=0; //初始层数和末尾结点 if(!T){ return ; } Bi原创 2020-12-30 23:19:09 · 1123 阅读 · 0 评论 -
设一个仅包含运算二元算术表达式,以链表二叉树存储,写出计算该表达式的算法
基于后续遍历思想,递归计算左右子树的结果最后根据根节点的操作符计算结果typedef struct BiTNode{ ElemType data; struct BiTNode *lchild,*rchild;}*BiTree;//对二叉链表树中的结点计算ElemType Calculate(BiTree T){ BiTNode *p = T; //创建指针指向根结点 ElemType val_l, val_r; if(T){ ..原创 2020-12-30 22:47:47 · 1748 阅读 · 7 评论 -
栈的操作:逆波兰表达式计算
char Calval_InvertPoland(char Buffer[]){ InitStack(S); int i = 0; ElemType c, e1, e2; //定义操作符,运算数值 while(Buffer[i]!="#"){ //对数组中逆波兰表达式元素计算 //如果当前元素是数字则入栈 if((Buffer[i]!="+")||(Buffer[i]!="-")||(Buffer[i]!="*")||(Buffer[i]!="/")){ Pus.原创 2021-01-04 01:14:01 · 167 阅读 · 0 评论 -
非递归计算函数
计算公式:Pn(x) = 1, n=0 Pn(x) = 2x, n=1 Pn(x) =2*Pn-1(x)-2(n-1)Pn-2(x),n>1非递归使用栈实现函数的递归计算。//定义结构体Struct Stack{ int id; //函数参数 double val; //当前数值}S;//使用栈保存每一次计算的结果Double Pfun(int n, int x){ //n:当前参数,x为当前结果 InitStack(S); do...原创 2020-12-30 22:38:13 · 507 阅读 · 0 评论 -
二分算法:升序序列处在L[n/2]位置的元素为中位数,找出两个等长升序序列的中位数
算法思想:对两个表分别设头尾指针和中间位置,去两表中间位置进行比较,如果相等则直接返回当前元素;否则较大的数组放弃后一半,较小的数组放弃前一半int M_Search(ElemType A[], ElemType B[], int n){ int s1=0, s2=0, d1=n-1, d2=n-1, m1, m2; while(s1<d1 && s2<d2){ m1 = (s1+d1)/2; m2 = (s2+d2)/2; if(A[m1] == B[m2原创 2020-12-30 22:34:57 · 450 阅读 · 0 评论 -
数组构成最多水的容器
给定n个非负整数,图中i表示序号,ai为数值,由数值水平线构成容器中最多的水。如图所示,最多可以装7+6+2+5+4+7+7=48算法思想:设一个max存储最大容量,初试置0,取较大值作为边界,从后向前遍历,每次从取左右端点,然后从左从右遍历,总数累加,如果超过边界则以边界作为数值加入总量,每次遍历完,比较最大总量作为结果暂存,左边界后移,遍历结束返回最大值。int MaxCapacity(ElemType A[] ,int n){ int left = 0, right , te原创 2020-12-30 22:30:16 · 171 阅读 · 0 评论 -
求最长连续递增长度
算法思想:初试设最长递增长度max为-1,递增序列个数为1,初值A[0]设为temp,并与后继元素比较,如果后面的元素比当前元素大,则个数加1,否则当前个数与max比较,取最大者为新max,并且temp设为当前的元素,继续比较直到遍历结束。int maxLCS(ElemType A[], int n){ int(n<=1) return n; int count = 1, maxcount = 0; ElemType temp = A[0]; for(int i = 1; i<n原创 2020-12-30 22:24:20 · 255 阅读 · 0 评论 -
找到数组索引中心,使得该位置从左端累加之和,与从又向前到该位置元素之和相等
Input:nums={1,7,3,6,5,6} OutPut: 31+7+3=11 5+6=11,则nums[3]=6为索引中心算法思想:将总数累加最为右边的元素之和,再从前到后遍历,每次从右总数减去当前元素同时左总数加上当前元素,知道左右数和相等,返回当前坐标int pivotIndex(int A[] ,int n){ int ans ,leftsum=0, rightsum=0; for(int i=0; i<n; i++)...原创 2020-12-30 22:20:59 · 149 阅读 · 0 评论 -
在字符数组S=“abbxxxxzyy”中,包含最长连续字串为较大分组,输出该分组起始位置和终点位置
在字符数组S=“abbxxxxzyy”中,包含最长连续字串为较大分组,输出该分组起始位置和终点位置算法思想:设最长子分组的开头、结尾位置,初试个数为1,并不断与max进行比较int OutputStr(char *s, int n){int start, end, max = 1, count = 1; char temp;for(int i = 0; i<n ; i++){ temp = s[i]; //每一次将当前位置的元素作为最大分组的第一个元素 start =原创 2020-12-30 22:18:48 · 628 阅读 · 0 评论 -
顺序表操作:有N个各位正整数存放在A[]中,N位长度,找出其最小一位数字
有N个各位正整数存放在A[]中,N位长度,找出其最小一位数字。算法思想:基于辗转相除法,定义i取第一位数字,取i的十位数字作为循环变量,i个个位数字替代日常min的功能,这样子就可以用一个i实现用i和min。两个变量实现的功能,i%10即取个位上的数字,i/10即取i十位上的数字。int findMin(int A[], int &i){ i = A[0]; //第一个数字设为最小值 while(i/10 <= N-1){ if(i%10 >原创 2020-12-30 22:11:59 · 562 阅读 · 4 评论 -
分治算法--棋盘划分
一个2k×2k个方格棋盘中,其中一个方格与其他方格颜色不同,则该方格为特殊方格,且称该区域的棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图1的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。算法思想:将棋盘划分成四个子棋盘,对棋盘区域内方格进行判断,若有特殊方格,则覆盖其他三个子棋盘的交界处的三个方格(特殊子棋盘中的除外),然后递归继续对其他三个子棋盘依次划分,直到棋盘大小变成1x1大小递归公式:T(k) = 4T(k-1)+O(1) , k&...原创 2020-09-10 23:08:04 · 687 阅读 · 0 评论 -
判断二叉树是否为二叉排序树
二叉排序树要求:根节点的数值必须大于等于左子树的结点数值,同时小于等于右子树的结点数值int JudgeBST(BiTree T){ BiTNode *p = T; if(!T) return 0; InitQueue(Q); EnQueue(Q,p); while(!isEmpty(Q)){ DeQueue(Q,p); if(p->lchild){ if(p->lchild->...原创 2020-08-12 23:24:02 · 1775 阅读 · 1 评论 -
求二叉树的宽度
算法思想:基于层序遍历,使用两个队列循环对二叉树的结点遍历,绑定两个队列的长度,最后去最大者为二叉树的宽度#inlcude<stdio.h>#define ElemType inttypedef struct BiTNode{ ElemType data; struct BiTNode *lchild, *rchild;}*BiTree, BiTNode;int Width(BiTree T){ if(!T) return 0; in...原创 2020-08-11 23:50:14 · 465 阅读 · 1 评论 -
数据结构与算法(十一)-- 数组与矩阵
数组与矩阵1.数组:数组是由n个相同类型的数据元素构成的有限序列,每个数据元素成为一个数组元素,每个元素受n个线性关系。一维数组:(a0,a1,a2,...,an)二维数组: [(a0,0 , a0,1 , a0,2),(a1,0 , a1,1 ,a1,2)...]数组维度和维界不可变,除了初始化和销毁外,只有存储元素和修改元素的操作存储结构为顺序存储,一维数组...原创 2020-04-18 23:28:20 · 2579 阅读 · 0 评论 -
数据结构与算法(十)-- 串
串串是由零或多个字符构成的有限序列,记:s='a1a2…an'。其中 s 称为串名,'a1a2…an'称为串值。 计算串长(StrLength):串中字符个数。S = "Hello World!" 总长度为12。注意:引号不能省略 ...原创 2020-04-17 00:50:32 · 1597 阅读 · 0 评论 -
数据结构与算法(九)-- 队列
队列队列的定义:它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。顺序队:采用顺序存储结构的队列,存储空间连续。 front指向对头元素 rear 指向队...原创 2020-04-10 00:45:57 · 923 阅读 · 0 评论 -
数据结构与算法(八)-- 栈
栈栈的定义:(Stack)只允许在一端进行插入或者删除操作的线性表。 S = (a1,a2,a3,a4,a5) ...原创 2020-04-09 23:58:59 · 408 阅读 · 0 评论 -
数据结构与算法(七)--双向链表
双向链表如何求链表中p结点的直接前驱,其时间性能如何?从当前结点循环遍历判断p结点的直接前驱,时间复杂度为O(n)。通过p->next可以直接访问p结点的后继结点,时间复杂度为O(1)。如何快速获取p结点的前驱结点?通过结点添加指针域指向前驱结点。双链表:在单链表的每个结点中在设置一个指针域,指向其前驱结点.data:存放数据元素; next:存放该节点...原创 2020-03-16 23:46:44 · 683 阅读 · 0 评论 -
数据结构与算法(六)--循环链表
循环链表 将单链表的首尾相接,将终端节点的指针域由空指针改为指向头节点,构成单循环链表,称之为循环链表。空循环链表是头结点指针指向头结点。非空循环链表,由头结点指向非头结点的元素:空表和非空表的处理都需要附加头结点。插入结点:设需要在第三个结点处插入一个结点,将设定的值x赋给结点S,第二位的结点设为P结点,P结点指针域原来指向的后继结点赋给S结点的指针域,P重新指向S...原创 2020-03-16 21:59:54 · 913 阅读 · 0 评论 -
数据结构与算法(五)--链表的实现
线性表的链式存储单链表的定义:链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。...原创 2020-02-11 13:11:05 · 442 阅读 · 0 评论 -
数据结构与算法(四)--线性表的各种操作
8多说,直接注释+代码Demo:/**删除顺序表中最小值,由最后的元素填补这个位置**/bool Del_Min(sqList &L , ElemType &value){ if(L.length == 0) return false; value = L.data[0]; int pos = 0; for(int i = 1; i<L.lengt...原创 2020-02-11 12:52:01 · 1023 阅读 · 0 评论 -
数据结构与算法(三)--线性表基础
线性表基础2.1 线性表的定义和基本操作 线性表是有序且有限的 2.1.2 存在一个唯一的被称为“第一个”的数据元素; 2.2.2 存在一个唯一的被称为“最后一个”的数据元素; ...原创 2020-02-11 12:49:26 · 393 阅读 · 0 评论 -
数据结构与算法(一)--基本概念入门
数据结构 Data Structure一.基础概念绪论 1.1 数据元素(Data Element):是数据的基本单位,在程序中作为整体进行考虑和处理...原创 2020-02-11 12:42:03 · 487 阅读 · 0 评论 -
数据结构与算法(二)--算法的时间复杂度
一.算法时间复杂度1.使用递归实现 i~j的累加:#include<stdio.h>int fun(int k,int n){ if(n<=k){ //最后一个数 return k; //函数出口 } else{ return fun(k,n-1)+n; //递归累加,将本次的n与n-...原创 2020-02-10 22:21:31 · 473 阅读 · 0 评论