
数据结构与算法
李小健QH
终于有人告别三月天一路向南方
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
B树和B+树
B树B树高度B树插入B树删除原创 2021-07-08 16:43:52 · 125 阅读 · 0 评论 -
DAG图与拓扑排序
有向无环图描述表达式表达式转换为树根是*,右子树是((a+b)*(b*(c+d)) + (c+d)*e),左子树是((c+d)*e),以此类推。 2. 有向无环图(DAG)描述表达式合并方法拓扑排序存在回路的图没法拓扑排序拓扑排序算法实现LeetCode 210. Course Schedule II//时间复杂度:O(V+E)class Solution {public: vector<int> greedy(vector&l..原创 2021-07-02 17:06:42 · 678 阅读 · 1 评论 -
图的应用:最小生成树与最短路径
最小生成树(最小代价树)性质 1.最小生成树不是唯一 2. 最小生成树的边的权值之和总是唯一 3. 最小生成树的边数为顶点减1 ( n-1 ) Prim算法Kruskal算法 最短路径广度优先搜索(BFS)//伪代码//求顶点u到其他顶点的最短路径void BFS_MinDistance(Graph g, int u) { for (int i = 0; i < g.vexNum; ++i) { d[i] = ∞..原创 2021-07-01 19:00:16 · 480 阅读 · 0 评论 -
图的广度和深度搜索
来看看理科原创 2021-06-30 16:10:31 · 199 阅读 · 0 评论 -
图的基本操作
Adjacent(G,x,y):判断图G是否存在边<x,y>或(x,y)Neighbors(G,x):列出图G中与结点x邻接的边InsertVertex(G,x):在图G中插入顶点xDeleteVertex(G,x):在图G中删除顶点xAddEdge(G,x,y):若无向边 (x,y) 或者有向边 <x,y> 不存在,则向图G中添加该边RemoveEdge(G,x,y):若无向边 (x,y) 或者有向边 <x,y> 存在,则向.原创 2021-06-29 17:33:02 · 267 阅读 · 0 评论 -
图的存储结构
邻接矩阵法邻接表法十字链表(只用于存储有向图)解决了 邻接矩阵法的空间浪费 和 邻接表法的寻找指向自己的结点 困难问题。邻接多重法(存储无向图)原创 2021-06-29 14:29:49 · 145 阅读 · 0 评论 -
二叉排序树,平衡二叉树和哈夫曼树
二叉排序树二叉排序树查找//递归BiTNode *BST_Search_R(BiTree biTree, ElemType key) { if (biTree == NULL || key == biTree->data) return biTree; if (key < biTree->data) return BST_Search_R(biTree->lChild, key); else return BST_Search_R(biTree-.原创 2021-06-27 13:15:58 · 790 阅读 · 1 评论 -
线索二叉树
线索二叉树结构lChildlTagdatarTagrChildlTag:0左孩子,1前驱rTag:0右孩子,1后继//代码结构typedef struct ThreadNode { ElemType data; ThreadNode *lChild, *rChild; int lTag, rTag;} ThreadNode, *ThreadTree;中序构造线索二叉树按照中序遍历,初始化pre = NULL,pre指向上一个访问的结点.原创 2021-06-26 11:49:20 · 264 阅读 · 0 评论 -
树 和森林
树的存储结构双亲表示法孩子表示法孩子兄弟表示法树和森林的转换树转换为二叉树森林转换为二叉树二叉树转换为树或森林是唯一的树遍历先根遍历树后根遍历树层次遍历树森林的遍历先序遍历森林效果等同于对各个树进行先根遍历后序遍历森林(或者叫中序遍历)效果等同于对各个树进行后根遍历...原创 2021-06-26 11:48:51 · 185 阅读 · 0 评论 -
串:KMP算法
如何确定子串在主串的位置?• 暴力匹配算法//暴力查找子串位置int index(string s, string t) { int i = 0, j = 0; while (i < s.length() && j < t.length()) { if (s[i] == t[j]) { i++; j++; } else { i = i - ( j-1 );原创 2021-06-25 10:08:55 · 139 阅读 · 0 评论 -
窗口点击模拟
窗口点击模拟时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 32M,其他语言64M本题需要让你模拟一下在Windows系统里窗口和鼠标点击的操作,具体如下:1.屏幕分辨率为3840*2160,左上角坐标为(0, 0), 右下角坐标为(3839, 2159)2.窗口是一个矩形的形状,由左上角坐标(X, Y),和宽高(W, H),四个数字来定位。左上角坐标为(X, Y)、右下角坐标为(X+W, Y+H),其中左上角坐标一定会在屏幕范围内,其他一些部分可能会超过屏幕范围。3.窗口的点原创 2020-06-28 17:08:41 · 998 阅读 · 0 评论 -
数字之和专题
数字之和专题两数之和https://leetcode-cn.com/problems/two-sum///一遍hashmapclass Solution { public int[] twoSum(int[] nums, int target) { Map<Integer, Integer> map = new HashMap<>(); for (int i = 0; i < nums.length; i++) {原创 2020-05-29 16:52:09 · 184 阅读 · 0 评论 -
贪心法
暴力枚举 + 贪心法1.6.1 找出最大周长的三角形/*可以用穷举找出最长,三重循环。*/for (i = 0; i < a;++i) { for (j = i + 1; j < a; ++j) { for (k = j + 1; k < a; ++k) { len = b[i] + b[j] + b[k]; ...原创 2018-07-28 12:41:09 · 691 阅读 · 0 评论 -
十大排序算法简记
选择排序( Selection )选择排序是最简单的,也是最没有用的,因为它的时间复杂度是 O( n^2 ) ,而且还不稳定。思路:从左到右扫描过去,找出最小的数的下标,跟这一趟的最开始数的下标index 交互位置,后面重复第一趟过程。冒泡排序( Bubble )顾名思义,类似于冒泡的过程,它的时间复杂度是 O( n^2 ) ,稳定思路:从左到右扫描到 index,比较相邻...原创 2019-05-03 16:06:43 · 429 阅读 · 2 评论 -
简单表达式计算
给定一个合法的表达式字符串,其中只包含非负整数、加法、减法以及乘法符号(不会有括号),例如7+345+2+4-3-1,请写程序计算该表达式的结果并输出;输入描述:输入有多行,每行是一个表达式,输入以END作为结束输出描述:每行表达式的计算结果输入例子1:7+345+2+4-3-12-3*1END输出例子1:69-1# include <iostream># i...原创 2019-05-10 09:06:45 · 1206 阅读 · 0 评论 -
精灵鼠从入口到出口的最少减少速度
时间限制:2秒空间限制:131072K猛兽侠中精灵鼠在利剑飞船的追逐下逃到一个n*n的建筑群中,精灵鼠从(0,0)的位置进入建筑群,建筑群的出口位置为(n-1,n-1),建筑群的每个位置都有阻碍,每个位置上都会相当于给了精灵鼠一个固定值减速,因为精灵鼠正在逃命所以不能回头只能向前或者向下逃跑,现在问精灵鼠最少在减速多少的情况下逃出迷宫?输入描述:第一行迷宫的大小: n >=2 &am...原创 2019-05-16 11:15:03 · 549 阅读 · 0 评论 -
比较两个版本字符串version1和version2
时间限制:1秒空间限制:32768K如果version1 > version2 返回1,如果 version1 < version2 返回-1,不然返回0.输入的version字符串非空,只包含数字和字符.。.字符不代表通常意义上的小数点,只是用来区分数字序列。例如字符串2.5并不代表二点五,只是代表版本是第一级版本号是2,第二级版本号是5.输入描述:两个字符串,用空格分割。...原创 2019-05-11 19:41:09 · 1706 阅读 · 0 评论 -
顺时针打印数字矩阵
时间限制:1秒空间限制:32768K给定一个数字矩阵,请设计一个算法从左上角开始顺时针打印矩阵元素输入描述:输入第一行是两个数字,分别代表行数M和列数N;接下来是M行,每行N个数字,表示这个矩阵的所有元素;当读到M=-1,N=-1时,输入终止。输出描述:请按逗号分割顺时针打印矩阵元素(注意最后一个元素末尾不要有逗号!例如输出“1,2,3”,而不是“1,2,3,”),每个矩阵输出完成后...原创 2019-05-11 21:24:39 · 543 阅读 · 0 评论 -
多层for循环优化
1.6.1 找出最大周长的三角形/*可以用穷举找出最长,三重循环。*/for (i = 0; i < a;++i) { for (j = i + 1; j < a; ++j) { for (k = j + 1; k < a; ++k) { len = b[i] + b[j] + b[k]; m原创 2019-05-12 13:33:51 · 4629 阅读 · 0 评论 -
计算n阶乘中尾部零的个数
计算因数5的个数即可long long NumOfZero(long long n){ long long count=0; while(n>0){ count+=n/5; n=n/5; } return count;}原创 2019-05-17 15:14:54 · 1632 阅读 · 0 评论 -
字符串压缩算法
时间限制:1秒空间限制:32768K1234输入一串字符,请编写一个字符串压缩程序,将字符串中连续出现的重复字母进行压缩,并输出压缩后的字符串。例如:aac 压缩为 1acxxxxyyyyyyzbbb 压缩为 3x5yz2b输入描述:任意长度字符串输出描述:压缩后的字符串输入例子1:xxxxyyyyyyzbbb输出例子1:3x5yz2b#include <...原创 2019-05-17 15:42:40 · 642 阅读 · 0 评论 -
寻找两个有序数组的中位数
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。你可以假设 nums1 和 nums2 不会同时为空。示例 1:nums1 = [1, 3]nums2 = [2]则中位数是 2.0示例 2:nums1 = [1, 2]nums2 = [3, 4]则中位数是 (2 + 3)...原创 2019-07-18 16:17:09 · 163 阅读 · 0 评论 -
盛最多水的容器
给定 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器,且 n 的值至少为 2。示例:输入: [1,8,6,2,5,4,8,3,7]输出: 49来源:力扣(LeetCode)链...原创 2019-07-18 17:01:43 · 148 阅读 · 0 评论 -
01背包问题
动态规划算法一般用来求解最优化问题,当问题有很多可行解,而题目要求寻找这些解当中的“最大值”/“最小值”时,通常可以采用DP。01背包问题 有n个重量和价值分别为wi,vi的物品。从这些物品中挑选出总重量不超过W的物品,求所有挑选方案中价值总和的最大值。输入n=4(w,v)={(2,3),(1,2),(3,4),(2,2)}W=5----------输出7递归函数搜索...原创 2018-07-28 12:36:16 · 234 阅读 · 0 评论