算法
文章平均质量分 52
葫芦大仙
胡乱写写
展开
-
树的存储
二叉树的存储连续存储(以完全二叉树形式存储)因为内存是连续的,而树本身是一个非连续的形式,所以如果一颗二叉树想要以数组形式存储时必须转化为完全二叉树形式存储。例子:图中这个二叉树想要存储就必须先化成满二叉树蓝色的都为垃圾节点,然后再删除右侧垃圾节点,使满二叉树变成完全二叉树优点:查找某个节点的父节点和子节点(也包括判断有没有子节点)的速度很快缺点:耗用内存空间过大链式存储...原创 2021-02-22 17:18:27 · 1615 阅读 · 0 评论 -
队列
定义先进先出分类跟栈一样,分为静态(数组)和动态(链表)静态队列静态队列都必须是循环队列结构图如下,rear指针必须指向队尾最后一个元素的下一个位置,这就比如链表中的头指针和尾指针一样:如果有头结点(即头指针指空)那么尾指针就指向最后一个元素,如果尾指针指向最后一个元素的下一个(即尾指针指空),那么就没有头结点。即不管是数组还是链表,头尾两指针必须有一个指空...原创 2021-02-18 17:14:47 · 73 阅读 · 0 评论 -
typedef的用法--结构体
也就是给int取了一个新名字叫zhnagsan,其实结构体中的大括号可以理解成一个空格,这样子typedef的用法其实都一样了。也就是相当于给int指针类型起了一个新名字叫做李四。这种表示中PA等价于 struct Arr *加一个*号其实类似于非结构体中的。A等价于struct Arr。这一部分才是一个整体。原创 2021-02-15 18:00:25 · 806 阅读 · 0 评论 -
结构体
定义结构体是用户根据实际需要自己定义的复合数据类型,其实跟java中类很像,结构体就相当于没有方法的类class Student{ int sid; char name[200]; int age; void speak(){};};将上面代码中方法去掉,class改成struct就成了结构体struct Student{ int sid; char name[200]; int age;};结构体定义了一个新的数据类型,不是变量,变量会分配内存,而数据类型不分配原创 2021-02-05 18:09:24 · 72 阅读 · 0 评论 -
栈
变量的分配方式 int t = 10;//这是静态分配,从栈中分配int t;t=(int)malloc(sizeof(int));//这是动态分配,从堆中分配栈的分类静态栈先进后出的数组动态栈先进先出的链表(头删头插)原创 2021-02-16 17:16:05 · 68 阅读 · 0 评论 -
指针
指针定义指针就是地址,而地址是内存单元的编号分类基本类型的指针int main(void){ int i = 10; int *p; p = &i;//指针p指向i printf("i的地址是:%p\np的地址是: %p\n", &i, &p); printf("i的值是:%d\np的值是:%p\n", i, p); printf("*p的值是,%d\n",*p); return 0;}从输出可以看出其中的结构为p与i是两个变量,改变p的值i原创 2021-02-05 00:17:42 · 139 阅读 · 0 评论 -
已知先序序列和中序序列,求后序序列
概念先序遍历:(1)访问根结点;(2)先序遍历左子树;(3)先序遍历右子树。中序遍历:(1)中序遍历左子树;(2)访问根结点;(3)中序遍历右子树。后序遍历:(1)后序遍历左子树;(2)后序遍历右子树;(3)访问根结点。由先序序列和中序序列求后序先序序列:gdafemhz中序序列:adefghmz第一步:先序序列的第一个字符是root,故root是g;第二步:确定root后,看中序序列,可以看出,g左边的adef是左子树的结点,右边hmz是右子树的结点;第三步:左子树ad原创 2020-06-03 23:17:49 · 10627 阅读 · 0 评论 -
二分查找算法
用二分去查找元素要求数组的有序性或者拥有类似于有序的性质一、mid = l + r + 1 >> 1 的+1问题因为 l + r 是下取整,所以如果 l = r - 1,那么mid = l,模板二的更新是l = mid = l,陷入了死循环int bsearch_2(int l, int r){ while (l < r) { int mid = l + r + 1 >> 1; if (check(mid)) l =原创 2022-03-04 21:42:39 · 49 阅读 · 0 评论 -
归并排序模板及思想
模板static final int N = 1000010;static int[] q = new int[N];static int[] tmp = new int[N];void merge_sort(int q[], int l, int r) { if (l >= r) return; int mid = l + r >> 1; merge_sort(q, l, mid); merge_sort(q, mid + 1, r);原创 2022-02-28 23:42:55 · 160 阅读 · 0 评论 -
kmp思想及模板代码
KMP算法解决的主要是优化BF算法,BF算法中第五趟不匹配时,第六趟可以直接从2开始,不需要从0开始,这种多余的匹配过程在kmp中取消了。kmp不再进行的指针回溯过程,只需要每次考虑指针即可原创 2022-06-08 20:39:33 · 60 阅读 · 0 评论 -
快排--模板及思想
模板void quick_sort(int[] q, int l ,int r) { if (l >= r) return; int x = q[l], i = l - 1, j = r + 1; while (i <j) { do i++; while (q[i] < x); do j--; while (q[j] > x); if (i <j) {原创 2022-02-18 23:00:13 · 197 阅读 · 0 评论 -
线性dp--最短编辑距离
一、题目https://www.acwing.com/problem/content/904/二、思想f[i][j]为a的前i个子母等于b的前j个字母所需要的操作次数的集合,题目要求的是最小值,针对a的前i个字母变成b的前j个字母有三种操作方式增:可以由a的前i个字母末尾增加一个b[j]来实现,可以用f[i][j-1]+1表示,加的那个1是本次增加操作的操作次数因为f[i][j-1]所表示的是a的前i个子母等于b的前j-1个字母所需要的操作次数的集合的最小值,f[i][j-1]是使他们相.原创 2022-04-30 14:31:45 · 165 阅读 · 0 评论 -
最长上升子序列
题目链接https://www.acwing.com/problem/content/897/一、求最长上升子序列长度这个题其实还是跟之前一样的思路,f[i]可以看作以num[i]为末尾的最长子序列的长度集合,现在要求集合中的最大值。f[i]可以用f[j]+1来表示,此处j是这个上升子序列的倒数第二个值,用循环来求import java.util.Scanner;public class Main { public static void main(String[] args) {原创 2022-04-23 21:53:23 · 177 阅读 · 0 评论 -
完全背包问题
一、思路f[i, j]与01背包问题一样,也可以看作是只考虑前i个物品,且总体积不大于j的所有选法的集合,完全背包求的结果相当于求这个集合的最大值二、状态计算对该问题的状态计算即对这个集合的划分,如图所示0表示不选第i个物品 f[i,j]=f[i-1,j]1表示选1个第i个物品f[i,j]=f[i-1,j-v[i]]+w[i]2表示选2个第i个物品…k表示选k个第i个物品 f[i,j] = f[i-1,j-k*v[i]] + k*w[i]最左边不选第i个物品的集合可以视为k=0的特殊情原创 2022-04-23 21:44:32 · 134 阅读 · 0 评论 -
分组背包问题
一、题型例题:https://www.acwing.com/problem/content/description/9/N组物品,每组有s个物品,每个物品的体积v,价值w,每组只能选一个物品,问如何选价值最大二、思路三、代码import java.util.Scanner;public class Main{ public static void main(String[] args){ Scanner in = new Scanner(System.in);原创 2022-04-23 21:50:29 · 112 阅读 · 0 评论 -
多重背包问题--二进制优化
特征:每个物品的个数有限集合划分跟完全背包一样,只不过k有上限s[i]一、暴力解法import java.util.Scanner;public class Main{ public static void main(String[] args) { Scanner in = new Scanner(System.in); int N = in.nextInt(); int V = in.nextInt(); int[] v =原创 2022-04-23 21:45:41 · 1677 阅读 · 0 评论 -
最长公共子序列
一、例题:给定两个长度分别为 NN 和 MM 的字符串 AA 和 BB,求既是 AA 的子序列又是 BB 的子序列的字符串长度最长是多少。输入格式第一行包含两个整数 NN 和 MM。第二行包含一个长度为 NN 的字符串,表示字符串 AA。第三行包含一个长度为 MM 的字符串,表示字符串 BB。字符串均由小写字母构成。输出格式输出一个整数,表示最大长度。数据范围1≤N,M≤10001≤N,M≤1000输入样例:4 5acbdabedc输出样例:3二、思路f[i]原创 2022-04-23 21:52:38 · 122 阅读 · 0 评论 -
石子合并--区间DP
顾名思义:区间dp就是在区间上进行动态规划,求解一段区间上的最优解。主要是通过合并小区间的 最优解进而得出整个大区间上最优解的dp算法。原创 2022-04-23 21:55:12 · 292 阅读 · 0 评论 -
Trie思想及模板
参考博文:https://www.acwing.com/solution/content/14695/课程链接:https://www.acwing.com/video/260/例题链接:https://www.acwing.com/problem/content/837/原创 2022-08-02 21:26:00 · 78 阅读 · 0 评论 -
试题D 跑步锻炼
试题D 跑步锻炼(10分)【问题描述】小蓝每天都锻炼身体。正常情况下,小蓝每天跑 1 千米。如果某天是周一或者月初(1 日),为了激励自己,小蓝要跑 2 千米。如果同时是周一或月初,小蓝也是跑 2 千米。小蓝跑步已经坚持了很长时间,从 2000 年 1 月 1 日周六(含)到 2020 年10 月 1 日周四(含)。请问这段时间小蓝总共跑步多少千米?【答案提交】这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。答原创 2021-04-03 12:51:44 · 223 阅读 · 0 评论 -
01背包例题及思路
例题有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。第 i 件物品的体积是 vi,价值是 wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。输入格式第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积。接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i 件物品的体积和价值。输出格式输出一个整数,表示最大价值。数据范围0<N,V≤10000<vi,wi≤1000输入样例4 51原创 2022-04-02 22:22:53 · 789 阅读 · 0 评论 -
汉诺塔 C语言
汉诺塔题目思想代码实现注意题目共三根柱子,把圆盘按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。思想主要运用了递归的思想,而递归本质上就是数学中的归纳法。所以我们先按照归纳法的思想看n=1时的情况:这时我们直接将盘子从A移动到C即可n=3时可以按照三步方法先把A上面的两个盘子(1、2)借助C移动到B再把A上仅有的3盘子直接移动到C在将B上面的两个盘子借助A移动到C可以看出n个盘子时的伪代码为:先把A上面的n-1个盘子原创 2021-02-19 16:48:18 · 167 阅读 · 0 评论 -
为什么对1e9+7取模
本篇是基于两篇较清晰的解析:为什么是1e9+7和1e9+7取模的易错点的总结为什么是1e9+7?1、1e9+7对int来说非常大,通常1e9代表无穷大int数值的范围是-2147483648 到 2147483647,1e10已经超出范围了,所以在计算最小值的操作中,1e9常用来初始化代表无穷大。2、对1e9+7取模的原因在一些算法题目中,会遇到这样的情况:由于结果可能较大,将结果mod 1e9+7,即mod 1000000007 。或者**( a * b ) % c = [ ( a % c原创 2022-02-06 02:02:07 · 10139 阅读 · 0 评论