数据结构与算法
文章平均质量分 94
数据结构与算法
邋遢的流浪剑客
成长中的基础架构攻城狮
展开
-
2024LeetCode分类刷题
在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第h层,则该层包含1~ 2h个节点。原创 2024-02-14 13:19:14 · 1327 阅读 · 2 评论 -
LeetCode分类刷题
一、数组11. 盛最多水的容器283. 移动零70. 爬楼梯15. 三数之和26. 删除排序数组中的重复项189. 旋转数组88. 合并两个有序数组1. 两数之和66. 加一二、链表206. 反转链表24. 两两交换链表中的节点141. 环形链表142. 环形链表 II25. K 个一组翻转链表21. 合并两个有序链表三、栈和队列20. 有效的括号155. 最...原创 2020-01-29 09:35:47 · 1269 阅读 · 0 评论 -
买卖股票问题
一、LeetCode121:买卖股票的最佳时机给定一个数组,它的第i个元素是一支给定股票第i天的价格如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润注意你不能在买入股票前卖出股票示例1:输入: [7,1,5,3,6,4]输出: 5解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6...原创 2019-12-17 07:52:42 · 314 阅读 · 0 评论 -
LeetCode腾讯精选练习(50 题)
一、数组相关题目1、LeetCode54:螺旋矩阵给定一个包含mxn个元素的矩阵(m 行,n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素示例1:输入:[ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ]]输出: [1,2,3,6,9,8,7,4,5]示例2:输入:[ [1, 2, 3, 4], [5, 6, 7, 8], [9...原创 2019-12-13 07:35:54 · 1312 阅读 · 0 评论 -
字符串操作问题
一、字符串基础问题1、LeetCode709:转换成小写字母实现函数ToLowerCase(),该函数接收一个字符串参数str,并将该字符串中的大写字母转换成小写字母,之后返回新的字符串示例1:输入: "Hello"输出: "hello"示例2:输入: "here"输出: "here"示例3:输入: "LOVELY"输出: "lovely"题解: public...原创 2019-12-08 16:18:13 · 696 阅读 · 0 评论 -
动态规划相关题目详解
一、LeetCode746:使用最小花费爬楼梯数组的每个索引做为一个阶梯,第i个阶梯对应着一个非负数的体力花费值cost[i](索引从0开始)每当你爬上一个阶梯你都要花费对应的体力花费值,然后你可以选择继续爬一个阶梯或者爬两个阶梯您需要找到达到楼层顶部的最低花费。在开始时,你可以选择从索引为0或1的元素作为初始阶梯示例1:输入: cost = [10, 15, 20]输出: 15解释...原创 2019-12-08 14:54:08 · 443 阅读 · 0 评论 -
初识AVL树和红黑树
一、平衡二叉查找树二叉查找树支持快速插入、删除、查找操作,各个操作的时间复杂度跟树的高度成正比。而平衡二叉查找树是为了解决普通二叉查找树在频繁的插入、删除等动态更新的情况下,出现时间复杂度退化的问题平衡二叉查找树中平衡的意思,其实就是让整棵树左右看起来比较对称、比较平衡,不要出现左子树很高、右子树很矮的情况。这样就能让整棵树的高度相对来说低一些,相应的插入、删除、查找等操作的效率高一些平衡二...原创 2019-12-02 09:05:35 · 258 阅读 · 0 评论 -
排序算法
排序算法过程动态图:https://visualgo.net/zh/sorting一、排序算法基础理论原地排序:特指空间复杂度是O(1)O(1)O(1)的排序算法排序算法的稳定性:如果待排序的序列中存在值相等的元素,经过排序之后,相等元素之间原有的先后排序不变,这种排序算法称为稳定的排序算法二、冒泡排序冒泡排序只会操作相邻的两个数据。每次冒泡操作都会对相邻的两个元素进行比较,看是否满足大...原创 2019-11-27 20:42:25 · 317 阅读 · 0 评论 -
LRU Cache、LinkedHashMap源码分析2.0
一、LRU CacheLRU Cache(最近最少使用缓存机制):当缓存容量达到上限时,它应该在写入新数据之前删除最近最少使用的数据值,从而为新的数据值留出空间LRU Cache工作示例:LRU Cache一般使用哈希表+双向链表来实现,支持时间复杂度为O(1)O(1)O(1)的查询、修改、更新操作二、LinkedHashMap源码分析2.0LinkedHashMap源码分析1.0:h...原创 2019-12-01 15:21:56 · 346 阅读 · 0 评论 -
Google布隆过滤器与Redis布隆过滤器详解
一、什么是布隆过滤器?布隆过滤器可以用来判断一个元素是否在一个集合中。它的优势是只需要占用很小的内存空间以及有着高效的查询效率。对于布隆过滤器而言,它的本质是一个位数组:位数组就是数组的每个元素都只占用1bit ,并且每个元素只能是0或者1布隆过滤器除了一个位数组,还有 K 个哈希函数。当一个元素加入布隆过滤器中的时候,会进行如下操作:使用K个哈希函数对元素值进行K次计算,得到K个哈希值...原创 2019-06-26 20:16:48 · 3514 阅读 · 5 评论 -
N皇后问题
LeetCode51:N皇后n皇后问题研究的是如何将n个皇后放置在n×n的棋盘上,并且使皇后彼此之间不能相互攻击上图为8皇后问题的一种解法给定一个整数n,返回所有不同的n皇后问题的解决方案每一种解法包含一个明确的n皇后问题的棋子放置方案,该方案中Q和.分别代表了皇后和空位示例:输入: 4输出: [ [".Q..", // 解法 1 "...Q", "Q...", "...原创 2019-11-29 10:02:15 · 539 阅读 · 0 评论 -
位运算
一、位运算1、位运算符运算符含义<<左移,左边的二进制位丢弃,右边补0>>右移,正数左补0,负数左补1,右边丢弃>>>无符号右移,右移后左边空出的位用零来填充,移出右边的位被丢弃|按位或,两位只要有一个为1,其值为1,否则为0,负数按补码形式参加&按位与,两位同时为1,结果才为1,否则为0,...原创 2019-11-27 08:55:04 · 365 阅读 · 0 评论 -
并查集
一、并查集并查集是一种树型的数据结构,用于处理一些不交集的合并及查询问题并查集主要包含以下几种基本操作:init(s):建立一个新的并查集,其中包含s个单元素集合union(x, y):把元素x和元素y所在的集合合并,要求x和y所在的集合不相交,如果相交则不合并find(x):找到元素x所在的集合的代表,该操作也可以用于判断两个元素是否位于同一个集合,只要将它们各自的代表比较一下就可以...原创 2019-11-24 14:52:18 · 8829 阅读 · 2 评论 -
Trie树(字典树)
一、Trie树Trie树,也叫字典树,是一种专门用来处理字符串匹配的树形结构,用来解决在一组字符串集合中快速查找某个字符串的问题Trie树可以最大限度地减少无谓的字符串比较,查询效率比哈希表高Trie树的本质就是利用字符串之间的公共前缀,将重复的前缀合并在一起举个例子,有6个字符串,分别是:how、hi、her、hello、so、see。对这6个字符串做一下预处理,组成Trie树的结构,每...原创 2019-11-19 07:19:36 · 799 阅读 · 0 评论 -
动态规划
一、动态规划1)动态规划和递归或者分治没有根本上的区别(关键看有无最优的子结构)相同点:找到重复子问题不同点:最优子结构、中途可以淘汰次优解2)使用DP解决问题的步骤找到重复子问题状态定义写出DP方程二、动态规划相关题目1、LeetCode62:不同路径一个机器人位于一个m x n网格的左上角 (起始点在下图中标记为“Start” )机器人每次只能向下或者向右移动一步。机...原创 2019-11-15 07:32:34 · 280 阅读 · 0 评论 -
二分查找
一、二分查找二分查找针对的是一个有序的数据集合,查找思想有点类似分治思想。每次通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为0二分查找的时间复杂度O(logn)O(logn)O(logn)非递归实现: public int bsearch(int[] nums, int value) { int low = 0; ...原创 2019-10-30 13:08:30 · 265 阅读 · 0 评论 -
深度优先搜索和广度优先搜索
一、DFS和BFS深度优先搜索(DFS):广度优先搜索(BFS):二、相关题目1、LeetCode102:二叉树的层次遍历给定一个二叉树,返回其按层次遍历的节点值(即逐层地,从左到右访问所有节点)例如:给定二叉树:[3,9,20,null,null,15,7] 3 / \ 9 20 / \ 15 7返回其层次遍历结果:[ [3], ...原创 2019-11-02 08:17:27 · 223 阅读 · 0 评论 -
贪心、分治、回溯算法
一、分治算法1、如何理解分治算法分治算法就是将原问题划分成n个规模较小,并且结构与原问题相似的子问题,递归地解决这些子问题,然后再合并其结果,就得到原问题的解分治算法的递归实现中,每一层递归都会涉及这样三个操作:分解:将原问题分解成一系列子问题解决:递归地求解各个子问题,若子问题足够小,则直接求解合并:将子问题的结果合并成原问题分治算法能解决的问题,一般需要满足下面这几个条件:...原创 2019-10-27 10:44:31 · 1580 阅读 · 0 评论 -
递归与斐波那契数列
一、什么是递归**递归就是函数自己调用自己。**举个简单的例子,排队的时候想要知道自己在第几排,于是你就问一下前面一排的人他是第几排,只要在他的数字上加一,就知道自己在哪一排了。但是,前面的人也不清楚,所以也问他前面的人。就这样一排一排往前问,直到问道第一排的人,说我在第一排,然后再这样一排排把数字传回来。直到你前面的人告诉你他在哪一排,于是你就知道答案了上面的这个例子,用递推公式表示就是:f...原创 2019-10-23 11:16:20 · 1061 阅读 · 0 评论 -
B树与B+树
转自:https://mp.weixin.qq.com/s/f1ZYdmmngjb1bpGnYMCfzw一、B树1、B树概念B树也称B-树,它是一棵多路平衡查找树。 为什么不用二叉树呢?数据库索引是存储在磁盘上的,当数据量大时,就不能把整个索引全部加载到内存了,只能逐一加载每一个磁盘页(对应索引树的节点)。每个节点的读取(访问)都对应一次磁盘IO操作,树的高度就等于每次查询数据时磁盘IO...转载 2019-10-27 16:07:48 · 247 阅读 · 0 评论 -
树、二叉树、二叉搜索树
一、树比如上图中,A节点就是B节点的父节点,B节点是A节点的子节点。B、C、D这三个节点的父节点是同一个节点,所以它们之间互称为兄弟节点。我们把没有父节点的节点叫作根节点,也就是图中的节点E。我们把没有子节点的节点叫作叶子节点或者叶节点,比如图中的G、H、I、J、K、L都是叶子节点树有三个比较相似的概念:高度、深度、层节点的高度=节点到叶子节点的最长路径(边数)节点的深度=根节点到这个...原创 2019-11-04 07:55:56 · 346 阅读 · 0 评论 -
散列表、LinkedHashMap源码分析
一、散列表1、散列思想散列表用的是数组支持按照下标随机访问数据的时候,时间复杂度是O(1)O(1)O(1)的特性。通过散列函数把元素的键值映射为下标,然后把数据存储在数组中对应下标的位置。当按照键值查询元素时,用同样的散列函数,将键值转化为数组下标,从对应的数组下标的位置取数据2、散列函数散列函数hash(key),其中key表示元素的键值,hash(key)的值表示经过散列函数计算得到...原创 2019-10-24 20:02:51 · 319 阅读 · 0 评论 -
栈、队列、ArrayDeque源码分析、优先队列PriorityQueue源码分析
一、栈1、什么是栈栈是一种操作受限的线性表,后进者先出,先进者后出,只允许在一端插入和删除数据当某个数据集合只涉及在一端插入和删除数据,并且满足后进先出、先进后出的特性,就应该首先栈这种数据结构栈主要包含两个操作,入栈和出栈,也就是在栈顶插入一个数据和从栈顶删除一个数据用数组实现的栈叫做顺序栈,用链表实现的栈叫做链式栈2、栈的代码实现1)、顺序栈public class Array...原创 2019-10-20 14:53:08 · 411 阅读 · 0 评论 -
数组、链表、LinkedList源码分析、跳表
一、数组1、什么是数组数组是一种线性表数据结构,它用一组连续的内存空间,来存储一组具有相同类型的数据线性表:数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。其实除了数组,链表、队列、栈等也是线性表结构非线性表:数据之间并不是简单的前后关系。比如二叉树、堆、图等连续的内存空间和相同类型的数据,正是因为这两个限制,数组才有了随机访问的特性,时间复杂度为O(1)O(1...原创 2019-10-19 10:31:44 · 473 阅读 · 0 评论