数据结构与算法
文章平均质量分 63
Tattoo_Welkin
Just do it !!!
展开
-
算法-贪心(Java实现)
文章目录剑指 Offer II 019. 最多删除一个字符得到回文思路:剑指 Offer II 019. 最多删除一个字符得到回文给定一个非空字符串 s,请判断如果 最多 从字符串中删除一个字符能否得到一个回文字符串。https://leetcode.cn/problems/RQku0D/思路:(1)首先判断是不是回文,然后遍历字符串,判断删除每一个字符位置后是不是回文。时间复杂度 O(n)(2)class Solution { public boolean validPalindro原创 2022-05-21 10:41:19 · 208 阅读 · 0 评论 -
算法-并查集(Java实现)
文章目录一级目录一级目录原创 2022-05-18 15:05:39 · 393 阅读 · 0 评论 -
动态规划之--背包问题基础专讲
文章目录01 背包完全背包01 背包完全背包原创 2022-04-01 13:45:18 · 277 阅读 · 0 评论 -
数据结构之并查集
文章目录概念如何代码实现两种优化手段看下main![在这里插入图片描述](https://img-blog.csdnimg.cn/fbf355c22e474cba98589b3591de9eb2.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVGF0dG9vX1dlbGtpbg==,size_20,color_FFFFFF,t_70,g_se,x_16)概念并查集 (union & fin原创 2022-03-10 23:36:05 · 376 阅读 · 0 评论 -
算法-贪心算法(Java实现)
文章目录买卖股票的最佳时机 II买卖股票的最佳时机 IIhttps://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii/description/原创 2022-02-19 17:00:55 · 328 阅读 · 0 评论 -
算法-数组与链表(Java实现)
文章目录链表1.链表的逆置2.在O(1)时间内删除链表节点3.链表中的倒数第k个节点4.合并两个排序的链表5.两个链表的第一个公共节点6.环形链表(圆圈中最后剩下的数字)判断是否有环(快慢指针&&龟兔赛跑思想)7.二叉搜索树与双向链表8.复杂链表的复制9.两两交换链表中的节点链表1.链表的逆置当打算修改输入的数据时,最好问清面试官是否可以!!!思路:使用栈的结构,时间复杂度O(n),空间复杂度O(n)递归,时间复杂度O(n),空间复杂度O(n),由于使用递归,将会使用隐式栈原创 2022-02-15 21:27:31 · 742 阅读 · 0 评论 -
哈希算法
对于哈希算法,在我们平时的开发中,都是基本上拿来就用就行了,所以这节我们将重点放在如何使用,并不进行哈希算法的原理剖析和如何设计一个哈希算法的讲解.什么是哈希算法?将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法,而通过原始数据映射之后得到的二进制值串就是哈希值(散列值).一个优秀的哈希算法需要满足:从哈希值不能反向推导出原始数据(所以哈希算法也叫单向哈希算法)...转载 2019-01-21 14:51:16 · 46302 阅读 · 5 评论 -
散列表(上)
散列思想散列表就是我们平常说的哈希表,英文名叫"Hash Table",其基础依据就是:散列表用的是数组支持按照下标随机访问数据的特性,所以散列表其实就是数组的一种扩展,由数组演化而来。可以说,如果没有数组,就没有散列表。这里还是直接使用老师的例子来说事吧.中间添加自己的思想就行了.自己想例子又得半天,而且我们的目标也不是想一个好例子,而是真正理解并掌握知识.对吧?用一个例子来解释一下。...原创 2019-01-14 18:00:26 · 1549 阅读 · 0 评论 -
红黑树原理详解
二叉查找树由于在频繁的动态更新过程中,可能会出现树的高度远大于 log2n的情况,所以就会导致各个操作效率下降,最坏的情况下就会退化为链表,变为O(n).很明显,想要解决这个问题,有效的一种办法就是使得树的高度不要差很多,也就是平衡它. 最先发明的平衡二叉查找树是AVL树,(它严格符合平衡二叉查找树的定义,即任何节点的左右子树高度相差不超过 1,是一种高度平衡的二叉查找树。)但是在...原创 2019-01-08 19:12:00 · 30989 阅读 · 6 评论 -
使用散列表和链表实现LRU缓存淘汰算法
LRU和LFULRU是最近最少使用页面置换算法(Least Recently Used),也就是首先淘汰最长时间未被使用的页面!LFU是最近最不常用页面置换算法(Least Frequently Used),也就是淘汰一定时期内被访问次数最少的页!frist,如何使用链表实现LRU(简单)我们维护一个有序单链表,越靠近链表尾部的结点是越早之前访问的。当有一个新的数据被访问时,我们从链表头开...原创 2019-01-18 15:41:25 · 940 阅读 · 0 评论 -
单链表的逆置(C++实现)
单链表以及逆置是什么就不说了,就简单说一下思想:链表的初始状态:具体的方法就是将头节点后面的节点,依次通过指针指向,插入head头节点之后,即可完成逆置过程. 示意图(这里我写一下中间处理流程,因为这样比较直观.第一次的处理与正常处理雷同):需要注意的主要有两点:1. 逆置之后的链表的尾部要NULL.在这里就是刚开始的时候的pHead->next->next = nu...原创 2018-12-10 16:39:22 · 4852 阅读 · 0 评论 -
使用Trie 树实现搜索引擎的搜索关键词提示功能
搜索引擎的搜索关键词提示功能不用讲了吧,相信大家都用过.那么他是如何实现的呐?今天就来说一说它底层最基本的原理:Trie 树什么是“Trie 树”?Trie 树,也叫“字典树”。顾名思义,它是一个树形结构。它是一种专门处理字符串匹配的数据结构,用来解决在一组字符串集合中快速查找某个字符串的问题。当然,这样一个问题可以有多种解决方法,比如散列表、红黑树,或者一些字符串匹配(KMP,BM)算法,...转载 2019-01-26 14:15:59 · 1631 阅读 · 0 评论 -
从索引出发理解几种常用的数据结构
为了加速数据库中数据的查找速度,我们常用的处理思路是,对表中数据创建索引。那你是否思考过,数据库索引是如何实现的呢?底层使用的是什么数据结构和算法呢?...转载 2019-02-25 17:03:05 · 3170 阅读 · 0 评论 -
[数据结构]递归树:借助树求解递归算法的时间复杂度
文章目录递归树与时间复杂度分析实战一:分析快速排序的时间复杂度实战二:分析斐波那契数列的时间复杂度实战三:待补充,先学其他的...递归树与时间复杂度分析我们前面讲过,递归的思想就是,将大问题分解为小问题来求解,然后再将小问题分解为小小问题。这样一层一层地分解,直到问题的数据规模被分解得足够小,不用继续递归分解为止。如果我们把这个一层一层的分解过程画成图,它其实就是一棵树。我们给这棵树起一个名...转载 2019-03-10 13:41:07 · 2456 阅读 · 0 评论 -
[数据结构]AC自动机和A*搜索算法简单概述
玩吃鸡->谩骂词语->会变成****->如何实现的?实际上,这些功能最基本的原理就是字符串匹配算法,也就是通过维护一个敏感词的字典,当用户输入一段文字内容之后,通过字符串匹配算法,来查找用户输入的这段文字,是否包含敏感词。如果有,就用“***”把它替代掉。我们前面讲过好几种字符串匹配算法了,它们都可以处理这个问题。但是,对于访问量巨大的网站来说,比如淘宝,用户每天的评论数有几亿、甚至几十...转载 2019-03-11 11:51:39 · 627 阅读 · 0 评论 -
动态规划再入门
文字目录“一个模型三个特征”理论讲解1. 最优子结构2. 无后效性3. 重复子问题“一个模型三个特征”实例剖析 “两种DP思路总结1.状态转移表法2. 状态转移方程法四种算法思想比较(回溯,贪心,分治,DP)回溯与DP:贪心与DP总结一下今天主要总结一下DP的理论支持和与其他几种算法思想的比较,OK,事不宜迟,立马开始吧!!!:适用于:动态规划比较适合用来求解最优问题,比如求最大值、最小值等等...转载 2019-03-15 21:55:47 · 292 阅读 · 0 评论 -
[ 数据库索引 ] B树和B+树
B+树点击这里即可B树(多路平衡查找树,基本特性同B+树)B 树中的每个节点由两部分组成:数据指向孩子节点的指针每一个节点最多包含k个孩子,k被称为B树的阶,k的大小取决于磁盘页的大小(一个节点一次IO,一页)一个m阶的B树具有如下几个特征:1.根结点至少有两个子女。2.每个中间节点都包含k-1个元素和k个孩子,其中 m/2 <= k <= m3.每一个叶子节...原创 2019-03-17 19:27:40 · 1218 阅读 · 0 评论 -
剑指 offer 全记录
文章目录排序查找数组字符串链表排序查找数组二维数组中的查找在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。思路:把每一行看成有序递增的数组,利用二分查找,通过遍历每一行得到答案,时间复杂度是nlogn字符串链表...原创 2019-10-15 08:29:07 · 1911 阅读 · 0 评论 -
排序算法总结与几道排序题
1.冒泡与选择冒泡:冒泡排序只会操作相邻的两个数据。每次冒泡操作都会对相邻的两个数据进行比较,如果前者比后者大,就互相交换,最后就会找到一个最大的落在数组最后.重复以上工作n次即可完成排序.void BubbleSort(vector&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;int&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt; a){ int原创 2018-12-07 22:31:36 · 1238 阅读 · 0 评论 -
二分查找算法的几种实现
最简单的二分1.循环实现template &amp;lt;typename T&amp;gt;bool binary_search(const vector&amp;lt;T&amp;gt; &amp;amp;set, const T &amp;amp;value){ auto low = set.begin(); auto high = set.end(); auto mid = low + ((原创 2018-11-04 22:52:10 · 237 阅读 · 0 评论 -
二叉树基本数学知识,建立及三种递归遍历
一.基本知识1. 数学知识(1)在二叉树的第i层上最多有2^(i-1)个节点(2)深度为k的二叉树最多有2^(k)-1 个节点(3)对任意二叉树,若叶子节点数为n0,度(节点拥有子树的个数)为2的节点数为n2,则 n0==n2+1 (4)对于具有n个节点的完全二叉树,如果按照对满二叉树节点连续编号的方式,对所有节点从1开始顺序编号,则对于任意序号为i的节点有: 如果 i==1 ,则没有双亲节点。i原创 2017-11-14 22:51:46 · 938 阅读 · 0 评论 -
约瑟夫环问题--循环链表
问题描述:设有编号为1,2,……,n的n(n>0)个人围成一个圈,每人手中持有一个密码(正整数)。一开始给定一个m 值,从第1个人开始报数,报到m时停止报数,报m的人出圈,将他手中的密码作为新的m 值。再从他的下一个人起重新报数,报到m时停止报数,报m的出圈,……,如此下去,直到所有人全部出圈为止。当任意给定n和m后,设计算法求n个人出圈的次序。问题分析:因为问题还是比较简单的,所以给出以下链接:约原创 2017-09-12 12:48:37 · 478 阅读 · 0 评论 -
中缀表达式转后缀表达式之多项式计算器
问题描述:输入一个多项式的表达式,要求得到计算后的结果。比如:输入3+(4+5)*2-5,输出结果0 。(什么,你居然说我没算对,你怕是有毒~~)要求:1. 可以计算多位整数。比如2就是个位整数,234就是多位整数。2. 满足带括号的要求问题分析:给两个栈,一个存放数值,一个存放字符。用栈的方法把中缀表达式转换为后缀表达式:见链接这里写链接内容然后从字符栈中出一个字符,从数值栈中出二个数字,进行运算原创 2017-10-25 22:03:29 · 629 阅读 · 0 评论 -
栈的应用--进制转换
问题描述:给一个整数,要求把它转换成相应的二进制。题目解读:整数:1.考虑正负.2.如果整数是0 具体思路:可能学过编程的娃都知道,十进制转二进制就是不断的给它取余,再取余,然后倒着写出来就行了。那么这个过程是不是正好满足栈先进后出的特点呐。嘿嘿~+~在这里,我们用两种方法来解决这个问题。一种是顺序栈,一种是链式栈。顺序栈#include<stdio.h>#include<stdlib.h>#d原创 2017-10-16 22:02:09 · 4503 阅读 · 0 评论 -
栈的应用--马踏棋盘-贪心加栈
问题描述问题牵引:1.为什么用数组来作为栈的实现,而不是动态分配,指针加减?2.directionNext和count数组起了什么作用?是如何实现的?3.为什么需要while(1)?它是如何起作用的?为什么需要贪心?4.贪心的思想是如何实现的?5.核心代码过程的实现是怎样的?实现代码:#include <stdio.h>#include <stdlib.h>#include <time原创 2017-10-21 12:31:25 · 749 阅读 · 1 评论 -
栈的应用--马踏棋盘-DFS搜索
问题描述:将马随机放在国际象棋的Board[0~7][0~7]的某个方格中,马按走棋规则进行移动。走遍棋盘上全部64个方格。编制程序,求出马的行走路线,并按求出的行走路线,将数字1,2,…,64依次填入一个8×8的方阵,输出之。实现思路:DFS 搜索(因为我们的马要踏遍所有的方格,所以我们在这里不需要visted数组,因为如果我们要判断是否走过的话,完全就可以用棋盘是否等于零来判断,同时也提高了一丢原创 2017-10-21 12:11:50 · 1379 阅读 · 0 评论 -
栈的应用--迷宫问题
问题描述:给定一个迷宫,给定入口和出口,找到从入口到出口的一条路径(任何一条路径都可以),迷宫为0表示可走,为1表示墙。用1将迷宫围起来避免边界问题。实现思路:1.DFS搜索(递归)2.采用栈的数据结构下面分别用这两种方法来解决这个问题。DFS搜索(即递归+回溯)#include<stdio.h>#include<stdlib.h>#include<string.h>#include <uni原创 2017-10-18 10:08:41 · 3559 阅读 · 1 评论 -
栈的应用--括号匹配
栈的应用–括号匹配这里我以leetcode 上的一道题来进行问题的描述:由于只包含字符的字符串'(',')','{','}','['和']',确定输入字符串是有效的。括号必须关闭以正确的顺序,"()"并且"()[]{}"都是有效的,但"(]"并"([)]"没有。编程判断括号是否匹配实现思路: 遇到左括号就进栈,遇到右括号就出栈。代码实现如下:#include<stdio.h>#include<st原创 2017-10-17 13:15:09 · 409 阅读 · 0 评论 -
二叉树的三种非递归遍历和层次遍历
1 .三种非递归遍历(栈)所要遍历的树是:先序 + 中序思路:就拿先序遍历为例来说吧。 1.访问根节点,根节点入栈,进入左子树。 2.访问左子树的根节点,根节点入栈,进入下一层左子树。 3.重复直到当前节点为空。即到达了最**左下方**的节点 4.如果栈不为空,就从栈顶取出节点,进入其右子树 5.直到当前节点和栈都为空时,结束。(栈为空就是所有的入栈的节点的右子原创 2017-11-23 23:06:17 · 6525 阅读 · 2 评论 -
KMP算法的实现及优化
什么是模式匹配?给定一个子串,要求在某个字符串中找出与该子串相同的所有子串,这就是模式匹配。也就是我们平常在记事本中的“查找选项”所运用的算法,其实说白了就是让我们编程实现:在一个大的字符串中找到一个小的字符串并返回其第一个匹配字符的下标BF算法时间复杂度为O(m×n),m和n分别是模式串与主串的长度。思路:将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T原创 2017-11-26 15:07:00 · 716 阅读 · 0 评论 -
动态规划(DP)01
关于他们的思想,这里就不再罗嗦了,直接 show you my code ,看题讨论 。题目1:自然是最最经典的塔类问题啦(数字之塔 )有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少? Input 输入数据首先包括一个整数C,表示数据的个数。 每个测试实例的第一行是一个整数N(1 &amp;amp;amp;amp;amp;amp;amp;amp;lt;= N &amp;amp;amp;amp;amp;原创 2018-08-07 09:31:03 · 767 阅读 · 0 评论 -
Leetcode 算法-搜索(DFS,BFS)
题目1 : 单词搜索给定一个二维网格和一个单词,找出该单词是否存在于网格中。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。示例:board = [ [‘A’,’B’,’C’,’E’], [‘S’,’F’,’C’,’S’], [‘A’,’D’,’E’,’E’] ]...原创 2018-08-11 09:54:45 · 1275 阅读 · 2 评论 -
AVL树01(c++代码实现)
前面我们提到输入的数据正好是升序或降序序列时,二叉排序树就会退化成一个单链表,时间复杂度变为 O(N)(如果没看前面,点这里),这是我们所不希望的。我们也提出了解决办法,那就是“平衡”BST树。 AVL树:最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树。查找、插入和删除在平均和最坏情况下的时间复杂度都是O(log{n}),增加和删...转载 2018-08-14 10:28:51 · 3168 阅读 · 6 评论 -
搜索之(DFS,BFS)01
关于他们的思想,这里就不再罗嗦了,直接 show me your code ,看题讨论 。题目1:定义一个二维数组: int maze[5][5] = {0, 1, 0, 0, 0,0, 1, 0, 1, 0,0, 0, 0, 0, 0,0, 1, 1, 1, 0,0, 0, 0, 1, 0,};它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,...原创 2019-03-26 08:35:34 · 560 阅读 · 0 评论 -
二叉查找树01(c++代码实现)
最近写项目写得让人有点烦躁,于是找了点新鲜的东西搞——二叉查找树(BST),来提提兴趣,废话不多说,现在就让我们进入BST的世界吧!1. 定义二叉查找树(Binary Search Tree),又称二叉排序树(Binary Sort Tree),亦称二叉搜索树。二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:若左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值;...原创 2018-07-27 14:49:03 · 3759 阅读 · 2 评论 -
经典动态规划-01之最长上升(递增)子序列
最长上升子序列(LIS)的定义: 一个数的序列bi,当b1 &lt; b2 &lt; … &lt; bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1, a2, …, aN),我们可以得到一些上升的子序列(ai1, ai2, …, aiK),这里1 &lt;= i1 &lt; i2 &lt; … &lt; iK &lt;= N。比如,对于序列(1, 7, 3, 5原创 2018-07-20 12:10:14 · 5909 阅读 · 0 评论 -
Leetcode中级算法-动态规划02
题目:不同路径一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。问总共有多少条不同的路径? 例如,上图是一个7 x 3 的网格。有多少可能的路径?说明:m 和 n 的值均不超过 100。示例 1:输入: m = 3, n = 2 输...原创 2018-07-19 11:15:47 · 606 阅读 · 0 评论 -
Leetcode中级算法-动态规划01
1. 感性认识“动态规划”1. 基本概念 是求解决策过程(decision process)最优化的数学方法。把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解,是一种解决这类过程优化问题的新方法。2. 使用技巧: 动态规划算法通常用于求解具有某种最优性质的问题!!!特别的 ,动态规划(Dynamic Programming)对于子问题重叠的情况特别有效...原创 2018-07-18 19:02:57 · 461 阅读 · 0 评论 -
递归的两种思路
理解递归,首先要理解栈是什么栈:就是放在桌子上的一叠盘子官方解释:栈(stack)又名堆栈,是一种运算受限的线性表。仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。人话解释:所谓的栈就是原创 2017-07-19 08:37:33 · 2159 阅读 · 0 评论