手撕数据结构与算法
数据结构与算法代码实现
P1ay_
一个想做独立游戏人的大三咸鱼。
展开
-
leetcode 题解报告 最大二叉树系列
leetcode最大二叉树系列654. 最大二叉树998. 最大二叉树 II654. 最大二叉树给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下:二叉树的根是数组中的最大元素。左子树是通过数组中最大值左边部分构造出的最大二叉树。右子树是通过数组中最大值右边部分构造出的最大二叉树。通过给定的数组构建最大二叉树,并且输出这个树的根节点。输入:[3,2,1,6,0,5]输出:返回下面这棵树的根节点: 6 / \ 3 5 \原创 2020-12-30 00:20:01 · 116 阅读 · 0 评论 -
Leetcode 解题报告 剑指 Offer 32 从上到下打印二叉树系列
从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。例如:给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回其层次遍历结果:[ [3], [9,20], [15,7]]题解:之前的博客,遍历都是通过Visit()函数来打印在控制台的,这个题目虽说是简单的BFS层序遍历,但要求将每层的数据单独分类,比较有意思。这里用二维数组。/** * Definition原创 2020-12-27 10:42:15 · 2055 阅读 · 6 评论 -
深度优先搜索算法DFS
DFS介绍类似于二叉树的先序遍历,先遍历深度,再回退LeetCode 589. N叉树的前序遍历给定一个 N 叉树,返回其节点值的前序遍历。例如,给定一个 3叉树 :返回其前序遍历: [1,3,5,6,2,4]解法:用递归+栈实现简单DFS代码/*// Definition for a Node.class Node {public: int val; vector<Node*> children; Node() {} Node(int原创 2020-12-26 11:29:02 · 105 阅读 · 1 评论 -
广度优先搜索算法BFS
BFS介绍类似于二叉树层序遍历,先遍历同一深度的结点,遍历完后再向不同深度遍历LeetCode面试题 04.03. 特定深度节点链表给定一棵二叉树,设计一个算法,创建含有某一深度上所有节点的链表(比如,若一棵树的深度为 D,则会创建出 D 个链表)。返回一个包含所有深度的链表的数组。示例:输入:[1,2,3,4,5,null,7,8] 1 / \ 2 3 / \ \ 4 5 7 / 8输出:[[1],[2原创 2020-12-26 10:35:02 · 1997 阅读 · 1 评论 -
LeetCode每日一题1431.拥有最多糖果的孩子
LeetCode每日一题1431.拥有最多糖果的孩子题目描述样例数据题解&new skll √题目描述给你一个数组 candies 和一个整数 extraCandies ,其中 candies[i] 代表第 i 个孩子拥有的糖果数目。对每一个孩子,检查是否存在一种方案,将额外的 extraCandies 个糖果分配给孩子们之后,此孩子有 最多 的糖果。注意,允许有多个孩子同时拥有 最多 的糖果数目。样例数据示例 1:输入:candies = [2,3,5,1,3], extraCand原创 2020-06-01 18:48:55 · 386 阅读 · 0 评论 -
LeetCode每日一题837. 新21点
LeetCode每日一题837. 新21点题目描述样例数据题解&new skills √优化前(TLE)优化后(AC)题目描述爱丽丝参与一个大致基于纸牌游戏 “21点” 规则的游戏,描述如下:爱丽丝以 0 分开始,并在她的得分少于 K 分时抽取数字。 抽取时,她从 [1, W] 的范围中随机获得一个整数作为分数进行累计,其中 W 是整数。 每次抽取都是独立的,其结果具有相同的概率。当爱丽丝获得不少于 K 分时,她就停止抽取数字。 爱丽丝的分数不超过 N 的概率是多少?样例数据示例 1:原创 2020-06-03 11:41:33 · 937 阅读 · 1 评论 -
摩尔投票法
知乎简介首先请考虑最基本的摩尔投票问题,找出一组数字序列中出现次数大于总数1/2的数字(并且假设这个数字一定存在)。显然这个数字只可能有一个。摩尔投票算法是基于这个事实:每次从序列里选择两个不相同的数字删除掉(或称为“抵消”),最后剩下一个数字或几个相同的数字,就是出现次数大于总数一半的那个。形象化描述想象着这样一个画面:会议大厅站满了投票代表,每个都有一个牌子上面写着自己所选的候选人的名字。然后选举意见不合的(所选的候选人不同)两个人,会打一架,并且会同时击倒对方。显而易见,如果一个人拥有的选原创 2020-12-24 20:23:07 · 89 阅读 · 1 评论 -
图的邻接矩阵&邻接表(c++实现)
图的构造实现邻接矩阵邻接表邻接矩阵#define maxsize 20typedef char Vertex;typedef int Edge;typedef struct{ Vertex vexs[maxsize]; Edge edges[maxsize][maxsize]; int vnums,enums;}MGraph;void Create_MGraph(MGraph *G){ //创建有向图的邻接矩阵存储 cout<<"原创 2020-11-19 20:19:57 · 735 阅读 · 0 评论 -
哈夫曼树(最优二叉树)&哈夫曼编码(c++实现)
哈夫曼树&哈夫曼编码哈夫曼树(最优二叉树)哈夫曼编码(前缀编码)哈夫曼树(最优二叉树)具有最小带权路径长度的二叉树称为哈夫曼树权值越大的叶子节点越靠近根节点权值越小的叶子节点越远离根节点总是将最小权值和次最小权值的两个节点合并,依次往上构造树,这样根节点的权值就是最小权值假如哈夫曼树有n0个叶子节点,那么这棵树的总结点个数n=2*n0-1typedef struct{ int weight; int parent; int lchild;原创 2020-11-18 16:53:24 · 532 阅读 · 0 评论 -
线索二叉树 (C++实现)
线索二叉树就是在原有的二叉树上添加了两个tag属性,用来记录当前节点的线索如果ltag=0 lchild指向节点的左孩子如果ltag=1 lchild指向节点的前驱节点如果rtag=0 rchild指向节点的右孩子如果rtag=1 rchild指向节点的后继节点因为先、中、后序的前驱跟后继节点会有区别,所以二叉树线索化需要分为三种序列的线索二叉树,这里以后序为例typedef int datatype;typedef struct BiThrNode{ datatype data.原创 2020-11-17 21:33:17 · 201 阅读 · 0 评论 -
c++实现简单二叉树?这篇就够了!
二叉树一些概念创建&初始化二叉树二叉树的三种遍历递归版非递归版一些概念满二叉树:所有的分支节点都存在左子树和右子树,所有的叶子都在最下面一层。完全二叉树:叶子节点只能出现在最下层和次最下层,且最下层的叶子节点集中在树的左部。创建&初始化二叉树typedef int datatype;typedef struct bitnode{ datatype data; struct bitnode *lchild,*rchild;}BiTNode,*BiTree;原创 2020-11-17 16:24:50 · 470 阅读 · 0 评论 -
模式匹配kmp算法(c++)
啃了两天,总算是把kmp拿下了。唉 怪当初数据结构课没好好听void getnext(int next[],string t){ int j=0,k=-1; next[0]=-1; while(j<t.length()-1) { if(k == -1 || t[j] == t[k]) { j++;k++; if(t[j]==t[k])//当两个字符相同时,就跳过 next[j] = n.原创 2020-11-14 18:22:39 · 133 阅读 · 1 评论 -
图解简单迷宫问题(c++)
先上题迷宫问题输入输出样例输入输出题解思路&图解栈图解代码队列图解代码差异输入输入包含多组测试数据。输入的第一行是一个整数T,表示有T组测试数据。每组输入的第一行是两个整数N和M(1<=N,M<=100)。接下来N行,每行输入M个字符,每个字符表示迷宫中的一个小方格。字符的含义如下:‘S’:起点‘E’:终点‘-’:空地,可以通过‘#’:障碍,无法通过输入数据保证有且仅有一个起点和终点。输出输出对于每组输入,输出从起点到终点的最短路程,如果不存在从起点.原创 2020-11-12 22:02:44 · 483 阅读 · 0 评论 -
链队列(c++实现)
Create_LQueue(int size) 创建大小为size的链队列Push_LQueue(datatype x) queue.push()操作数入队Pop_LQueue() queue.pop()队列尾部出队//链队列#include<bits/stdc++.h>using namespace std;typedef int datatype;class Node{ public: datatype data; Node .原创 2020-11-11 22:45:53 · 161 阅读 · 0 评论 -
栈链(c++实现)
Create_LinkStack(int size) 创建大小为size的栈链Push_LinkStack(datatype x) 将x数据入栈Pop_LinkStack() 将栈链顶部元素出栈未加栈空判断,当前默认为栈不为空,主要体会数据交互过程#include<bits/stdc++.h>using namespace std;typedef int datatype;class Node{ //节点类 public: dataty.原创 2020-11-11 20:17:14 · 102 阅读 · 0 评论 -
双向链表如何实现?(c++)
比单链表多了一个rear前节点#include<bits/stdc++.h>using namespace std;typedef int datatype;class Node{ //节点类 public: Node *rear; //前节点 datatype data; Node *next; //后节点};class dlLinkList{ //双向链表类 public:原创 2020-11-11 09:41:38 · 240 阅读 · 0 评论 -
单链表的基本操作(c++)
CreateLinkList(int size) 创建大小为size的链表TravelLinkList() 遍历链表InsertLinkList(Node *data,int n) 将data节点插入链表第n个位置DeleteLinkList(int n) 删除链表第n个位置的节点CircleLinkList() 将单链表改造为循环链表LinkList类用到了new/delete(构造函数用new,析构使用了delete)来初始化head节点,默认head节点是(null,0,null)#.原创 2020-11-10 20:56:28 · 118 阅读 · 0 评论 -
线性表&顺序表(C++实现代码)
init_SeqList() 初始化线性表Insert_SeqList(SeqList *L,int i,datatype x) 插入x到线性表i的位置Delete_SeqList(SeqList *L,int i) 删除表中第i个元素(i=[1,n])Loaction_SeqList(SeqList *L,datatype x) 顺序表查找元素x#define MAXSIZE 20 //定义线性表最大长度typedef struct { .原创 2020-11-10 19:44:18 · 609 阅读 · 0 评论