算法
文章平均质量分 62
题目+代码实现
march of Time
程序媛一枚
展开
-
最长公共子序列和子序列长度
动态规划原创 2023-03-25 13:45:50 · 153 阅读 · 0 评论 -
字典树的介绍和类模板
字典树原创 2023-02-19 21:45:11 · 175 阅读 · 0 评论 -
311.稀疏矩阵的乘法Java版
给你两个 稀疏矩阵 A 和 B,请你返回 AB 的结果。你可以默认 A 的列数等于 B 的行数。三重循环直接全部乘即可,这种方法很简单,不再赘述。2.找出非0的元素进行相乘。请仔细阅读下面的示例。原创 2023-02-15 09:44:06 · 295 阅读 · 0 评论 -
二分查找各种类型例题
普通二分查找和进阶二分查找原创 2023-01-04 17:47:21 · 662 阅读 · 1 评论 -
滑动窗口与前缀和算法总结和例题
今天遇到两个题,其中一个用滑动窗口,另一个用前缀和,但是自己一时弄混了,对前缀和也还不熟练,在这里再总结一下。原创 2022-08-03 23:33:34 · 394 阅读 · 0 评论 -
对二维数组自定义排序、Treemap自定义排序、priorityqueue自定义排序
二维数组自定义排序Arrays.sort(intervals,new Comparator<int[]>() {@Overridepublic int compare(int[]a,int[]b){ return a[0]==b[0]?b[1]-a[1]:a[0]-b[0];} });Treemap自定义排序Map map = new TreeMap();map.put("a", "ddddd");map.put("c", "bbbbb");map.put("原创 2022-03-22 11:40:18 · 627 阅读 · 0 评论 -
优先级队列PriorityQueue在算法问题中的使用
文章目录优先级队列介绍与优先级队列有关的习题[179. 最大数][918. 环形子数组的最大和][1094. 拼车]前k个出现频率最高的数字用优先级队列合并k个有序链表滑动窗口的最大值其他:对二维数组自定义排序优先级队列介绍优先队列一般基于二叉堆实现,二叉堆:堆的根节点的优先级最大(即最大或最小)父节点的优先级必定大于子节点,兄弟节点的优先级不确定谁大谁小PriorityQueue:PriorityQueue是基于二叉堆原理的优先队列,队列用动态数组实现。它是非阻塞的、非线程安全的;Pri原创 2022-02-11 13:49:54 · 860 阅读 · 0 评论 -
递归非递归反转单链表、头插法和尾插法插入链表结点、单链表归并排序选择排序
文章目录递归翻转链表非递归反转头插法尾插法删除特定元素的结点链表选择排序单链表归并排序不使用额外空间合并升序链表:迭代法不使用额外空间合并升序链表:递归法递归翻转链表 //递归法翻转链表 public ListNode reverse(ListNode node) { if(node==null||node.next==null) return node; ListNode dummy = reverse(node.next); // 将原创 2022-02-10 13:29:21 · 543 阅读 · 0 评论 -
Java大数加法乘法减法、36进制加法
大数加法1、是整数; 2、两个数无限大,long都装不下; 3、不能用BigInteger; 4、不能用任何包装类提供的运算方法; 5、两个数都是以字符串的方式提供。/** * 思路:* 字符串逐位相加,需要进位则进位处理,考虑两个问题:* 1、char怎么转换为integer, 减去'0'即可 * 2、怎么处理对应位相加?反转字符串相加,正确处理进位即可, * 这样个位对应个位,十位对应十位,剩余的直接追加 * */ public static原创 2022-01-29 17:44:47 · 1007 阅读 · 3 评论 -
算法题目总结1
文章目录细节二分查找详解查找第一个大于等于给定值的元素滑动窗口在串s里找出包含t所有字母的最小子串求一个数组中子数组的最大平均数汉明距离双指针问题位操作动态规划问题套路背包问题:连续序列最大和编辑距离合并两个有序数组高楼扔鸡蛋动态规划之输出两个字符串最长公共子序列c++版BFS算法汉诺塔问题链表链表划分尾节点添加元素删除元素将单链表的每k个结点逆序删除倒数第k个节点单链表选择排序·单链表归并排序如何从尾到头输出单链表给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。不用额外开辟空间的链表合并2.递归合原创 2021-09-26 11:58:53 · 1886 阅读 · 0 评论 -
【数据结构】用java实现不同的七种排序算法和性能比较
文章目录1.直接插入排序2.希尔排序3.冒泡排序4.快速排序5.选择排序6.堆排序7.归并排序1.直接插入排序public class DifferentSort { public static void main(String[] args) { Insert insert = new Insert(); insert.sort(); }}class Insert { int total; int[] data = new int[原创 2021-07-12 17:05:58 · 427 阅读 · 0 评论 -
【算法】设计算法求所有强连通分量的完整代码(kosaraju算法)
代码:typedef struct anode { int adjvex;//该边的邻接点编号 struct anode* nexarc;//指向下一条边的指针 int weight;//该边的相关信息,比如权值}arcnode;//边结点类型typedef struct vnode { //InfoTyoe info; 顶点的其他信息 arcnode* firstarc;//指向第一个边结点}Vnode;//邻接表头结点类型typedef struct {原创 2021-07-06 12:54:52 · 342 阅读 · 0 评论 -
【练习】2021下半年数据结构刷题笔记和总结 (三)栈 队列 链表 枚举算法
题目来自书或者网站。 解密QQ 号——队列回文字符串---栈火柴棍等式输入数字n,要求输出从1~n的全排列解密QQ 号——队列小哈告诉了小哼一串加密过的数字,同时小哈也告诉了小哼解密规则。规则是这样的:首先将第1 个数删除,紧接着将第2 个数放到这串数的末尾,再将第3 个数删除并将第4 个数放到这串数的末尾,再将第5 个数删除……直到剩下最后一个数,将最后一个数也删除。按照刚才删除的顺序,把这些删除的数连在一起就是小哈的QQ 啦。现在你来帮帮小哼吧。小哈给小哼加密过的一串数是“6 3 1 7 5 8原创 2021-06-23 20:32:41 · 326 阅读 · 1 评论 -
【算法学习笔记】堆排序和归并排序、其他几种排序的代码实现、比较和应用(习题)
文章目录基本堆排序1.有20个数组,每个数组有500个元素,且是有序的,如何在20*500个数中找出排名前500的数基本堆排序调整为大根堆:void shif(int a[],int low,int high){ int i = low,j = 2*i;//j为左孩子 int temp = a[i]; while(j <= high) { if(j < high && a[j] < a[j+1])//如果右孩子更大 j++;原创 2021-06-20 17:16:27 · 245 阅读 · 0 评论 -
【算法学习笔记】哈夫曼树的构建和哈夫曼编码的实现代码
介绍哈夫曼(Haffman)这种方法的基本思想如下:①由给定的n个权值{W1,W2,…,Wn}构造n棵只有一个叶子结点的二叉树,从而得到一个二叉树的集合F={T1,T2,…,Tn}。②在F中选取根结点的权值最小和次小的两棵二叉树作为左、右子树构造一棵新的二叉树,这棵新的二叉树根结点的权值为其左、右子树根结点权值之和。③在集合F中删除作为左、右子树的两棵二叉树,并将新建立的二叉树加入到集合F中。④重复②、③两步,当F中只剩下一棵二叉树时,这棵二叉树便是所要建立的哈夫曼树。对于同一组给定叶子结点所构原创 2021-06-18 11:14:46 · 1283 阅读 · 1 评论 -
【算法学习笔记】二叉树的基本操作实现和应用举例,根据先序与中序遍历建立二叉树的实现
基本操作通常有:建立空二叉树、生成以X为根节点的数据域信息、将数据域信息为x的结点插入到二叉树bt中、删除某一个结点的左子树/右子树、查找某元素、遍历给某结点插入一个左孩子btnode<DataType>*btTree::Insert(btTree bt,DataType x,BtTree parent){//在二叉树bt中的parent所指结点和其左子树中 插入数据元素为x的结点btTree p;if(parent==NULL){return NULL;//如果不存在parent原创 2021-06-17 20:53:37 · 497 阅读 · 0 评论 -
【数据结构练习习题】java实现版(一)
练习目录仅用递归函数和栈操作逆序一个栈 不能用其他数据结构一个栈中元素的类型为整型,现在想将该栈从顶到底按从大到小的顺序排序,只许申请一个栈。仅用递归函数和栈操作逆序一个栈 不能用其他数据结构思路:设计两个递归函数,其中一个用于得到栈底的元素,另一个用于依次逆序栈,最后可得到一个新栈//先设计一个递归函数将栈的栈底元素返回并移除 public static int getAndRemoveLast(Stack<Integer>stack) { int res原创 2021-06-16 20:59:16 · 432 阅读 · 0 评论 -
【练习】树(Tree, UVa 548)给一棵点带权(权值各不相同)的二叉树的中序和后序遍历,找一个叶子使得它到根的路径上的权和最小。
给一棵点带权(权值各不相同,都是小于10000的正整数)的二叉树的中序和后序遍历,找一个叶子使得它到根的路径上的权和最小。如果有多解,该叶子本身的权应尽量小。输入中每两行表示一棵树,其中第一行为中序遍历,第二行为后序遍历。样例输入:3 2 1 4 5 7 63 1 2 5 6 7 47 8 11 3 5 16 12 188 3 11 7 16 18 12 5255255样例输出:13255//因为各个结点的权值各不相同且都是正整数,直接用权值作为结点编号const int maxv原创 2021-06-16 13:41:06 · 304 阅读 · 0 评论 -
【数据结构笔记】B树和B+树的实现,哈希查找,STL中的hash_map和unordered_map容器用法
B和B+树hash_map和unordered_map设计算法删除重复的元素设计算法找出元素之和为target的元素下标给出一组字符串,按组返回拥有相同变位词的字符串B和B+树B树和B+树都是用作外查找的数据结构,都是平衡多路查找树。两者的差异如下:1.在B+树中,具有n个关键字的结点含有n棵子树,即每个关键字对应一棵子树,而在B树中,具有n个关键字的结点含有(n+1)棵子树。2.在B+树中,除根结点外,每个结点中的关键字个数n的取值范围是m/2~ m,根结点n的取值范围是2~ m;而在B树中,.原创 2021-06-14 16:59:31 · 241 阅读 · 0 评论 -
【练习】2021下半年数据结构刷题笔记和总结 (二) 树、查找-- 不同的排序算法、二叉排序树 平衡二叉树、哈希表查找、线索二叉树、
记录自己下半年写题目的记录。题目来自书或者网站。文章目录1.一棵二叉排序树,设计算法查找两个结点之和等于给定值x的结点总结(一)的地址:https://blog.csdn.net/qq_41358574/article/details/117098620?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162343250816780357289113%2522%252C%2522scm%2522%253A%252220140713.13原创 2021-06-12 02:31:36 · 340 阅读 · 0 评论 -
【练习】不同排序算法执行时间比较
插入: template<typename DataType> void insert(DataType D[], int length) { DataType key; for (int j = 2; j < length; j++) { key = D[j];//先保存D[j]的位置,因为它可能会被替换 int i = j - 1; while (i > 0原创 2021-03-13 08:14:37 · 716 阅读 · 2 评论 -
【算法】广度遍历算法的应用 求出距离顶点v0的最短路径长度为最长的一个顶点,图结构的bfs生成树及其双亲表示形式
分析:用bfs算法(利用bfs算法的层次特性):从v0出发进行广度遍历时, 最后一层的顶点距离v0的最短路径长度最长。因而可能有多个解,按照本题要求,只要能求出其中一个便可。int maxdist (Graph G, int v0) { int w; Queue Q; // 定义算法中用到的局部变量和队列 for (i=1; i<=n; i++) visited[i]=FALSE;//初始化标志位原创 2021-05-30 03:03:24 · 1351 阅读 · 0 评论 -
【算法】深度优先搜索遍历的应用 设计算法以求解无向图G的连通分量的个数和无向图G的边数
应用一设计算法以求解无向图G的连通分量的个数图示:深度遍历基本算法dfs(v0)如下 : void dfs(int v0) { visite(v0); visited[v0]=TRUE; w=firstadj(G,v0); while(w!=0) { if(!visited[w]) dfs(w); w=nextadj(G,v0,w);原创 2021-05-28 10:01:38 · 2393 阅读 · 0 评论 -
【学习笔记】比较分别用prim和kruskal实现最小生成树和算法优化方案
kruskal:1.思路:设G=(V,E)是无向连通带权图,V={,…,n};设最小生成树T=(V,TE),该树的初始状态为只有n个顶点而无边的非连通图T=(V,{}),Kruskal算法将这n个顶点看成是n个孤立的连通分支。它首先将所有的边按权值从小到大排序,然后只要T中选中的边数不到n-1,就做如下的贪心选择:在边集E中选取权值最小的边(i,j),如果将边(i,j)加入集合TE中不产生回路(圈),则将边(i,j)加入边集TE中,即用边(i,j)将这两个连通分支合并连接成一个连通分支;否则继续选择下一原创 2021-05-24 16:08:34 · 427 阅读 · 1 评论 -
【练习】2021下半年数据结构刷题笔记和总结 (一)(图和动态规划)
1.编程将一个字符串中所有空格替换为“%20”#define _CRT_SECURE_NO_WARNINGS#include <iostream>#include<cstring>using namespace std;const int maxd = 20;//最大深度int m[1 << maxd];//最大结点个数为2的maxd次方-1//编程将字符串中的空格用%20代替,并返回替换后的总长度int Replace(char* p, i原创 2021-05-21 03:08:38 · 405 阅读 · 0 评论 -
【算法学习笔记】 图(四)用优先级队列优化Dijkstra算法求最短路径(邻接矩阵存储)
优先级队列:priority_queue,经过实验之后发现默认是首先输出最大的元素,现在想让队头为最小的元素,需要进行运算符重载此算法寻找源点到与它连接的所有顶点的最短路径运算符重载:struct Node { int u, step; Node() {}; Node(int a, int sp) { u = a; step = sp;//u为顶点,step为源点到顶点u的最短路径 } bool operator < (const N原创 2021-05-16 15:44:40 · 261 阅读 · 0 评论 -
【笔记】顺序存储结构求二叉树深度
代码:#include<vector>using namespace std;vector<int> e[100005];int dep[100005], f[100005];void dfs(int x) { int len = e[x].size(); f[x] = dep[x]; for (int i = 0; i < len; ++i) { dep[e[x][i]] = dep[x] + 1; dfs(e原创 2021-04-27 03:26:48 · 926 阅读 · 0 评论 -
【笔记】二叉树递归算法和非递归算法的实现 先序/中序/后续遍历 打印结点以及顺序数 构造二叉树
先序遍历和中序遍历先序:void preorder(bnode *t) { if(t!=NULL) { visit(t); preorder(t->lchild); preorder(t->rchlid); }}中序:void inorder(bnode *t) { if(t!=NULL) { inorder(t->lchild);原创 2021-04-25 12:02:25 · 412 阅读 · 0 评论 -
【练习】c++分别用层序遍历和递归求二叉树深度
递归求深度:struct node { int data; node* lchild;//指向左孩子的结点 node* rchild;//指向右孩子的结点};int depth(node* root) { int l, r; node* tem = new node; if (root == nullptr) return 0; if (root->lchild == nullptr && root->rchild原创 2021-04-25 04:38:00 · 298 阅读 · 0 评论 -
【练习】c++单向链表求交集
思路:先递增排序再二路归并代码://直接插入排序void sort(node*& L) { node* p = L->next->next; node* q; L->next->next = NULL;//构建只含一个数据结点的有序表 node* pre = L; while (p != NULL) { pre = L;//注意每次最外面的while中都要初始化pre q = p->n原创 2021-04-21 03:35:14 · 474 阅读 · 0 评论 -
【笔记 】栈底层 循环队列的处理 链栈 链队列
队列解决“假溢出”问题的方法:采用循环队列方式:将数组的头尾看作是相邻的元素,即将元素data[0]看作是data[maxlen-1]的下一个元素。如图所示。因此,插入和删除以及状态检测需要作相应的调整:插入操作中移动指示位置的计算:if ( rear+1 == maxlen ) rear = 0;else rear++;或者:rear = ( rear + 1 ) % maxlen ;或者:rear = ( rear + 1 == maxlen ) ? 0 : rear ++ ;删除操原创 2021-04-03 04:01:25 · 144 阅读 · 0 评论 -
【算法】图(一)拓扑排序的实现 图的邻接表算法 判断是否图G中存在环
判断无向图顶点是否全部连通//n 图的顶点数目 m图中边的数目 n为0时输入结束 有m行数据每行两个值x,y 表示顶点x y相连 顶点编号从1开始计算//如果所有顶点连通输出YES#include <iostream>#define maxnn 1005int A[maxnn][maxnn];//存放邻接矩阵int visited[maxnn];//顶点访问标记int n, m;int countt;int root[maxnn];using namespace std;原创 2021-01-14 02:02:42 · 1076 阅读 · 0 评论 -
【算法】图(二):图存储结构之邻接表和邻接矩阵类型 并查集
图的存储结构#define maxnn 10000using namespace std;typedef struct { int no;//顶点编号 //infotype info; 顶点的其他信息}vertextype;//顶点类型typedef struct { int edge[maxnn][maxnn];//邻接矩阵数组 发现如果maxnn定义过大的话会报错 int n, e;//顶点和边数 vertextype vexs[maxnn];//存原创 2021-01-02 01:01:32 · 489 阅读 · 0 评论 -
迷宫的最短路径
题目:N=10, M=10 (迷宫如下图所示。, ’ . ’ , -S’ ,分别表示墙壁、通道、起点和终点)#S######.##. .#.# ##.##.####.#######.#…# .####.###.G#给定一个大小为NxM的迷宫。迷宫由通道和墙壁组成,每一步可以向邻接的上下左右四格 的通道移动。请求出从起点到终点所需的最小步数。请注意,本题假定从起点一定可以移动 到终点。宽度优先搜索按照距开始状态由近及远的顺序进行搜索,因此可以很容易地用来求最短路径、最 少操作之类问题的答原创 2020-12-28 03:40:26 · 444 阅读 · 0 评论