算法和数据结构
文章平均质量分 86
对算法的学习总结,包括LeetCode和牛客网的刷题。
何时立秋丷
向前有路,未来可期!
每天进步一点点,努力为了遇见更好的自己。
展开
-
堆的特性与实现
文章目录堆的特性与实现堆的特性堆结构的实现应用一:堆排序应用二:TopK问题堆的特性与实现堆的特性根据堆中元素之间的大小关系,堆可以分为最大堆和最小堆。对于最大堆,某个节点的值总是大于等于其子节点的值;对于最小堆,某个节点的值总是小于等于其子节点的值。堆中各个节点组合起来是一颗完全二叉树。但是真正存储堆结构的时候,不是用树结构,而是采用数组来存储各个节点的值,这是因为完全二叉树可以很方便存储在数组中。所以存在两种视角来看待堆结构:二叉树的视角,把堆看成是一棵完全二叉树,但是这棵完全二叉树的节点之原创 2021-06-20 23:11:15 · 350 阅读 · 2 评论 -
LRU和LFU的底层原理和代码实现
分析LRU和LFU的底层数据结构,以及Java代码实现过程。原创 2021-04-13 20:10:01 · 552 阅读 · 0 评论 -
Morris遍历的图示理解以及代码实现
文章目录Morris遍历的图示理解以及代码实现1、遍历规则2、复杂度分析3、代码实现以及分析4、Morris遍历实现前中后序遍历Morris遍历的图示理解以及代码实现1、遍历规则假设当前正在遍历的节点是cur,那么cur的移动规则如下:如果cur没有左孩子,则cur向右移动,即cur = cur.right。如果cur有左孩子,找到cur左子树上最右边的节点,将这个节点记为mostRight,根据mostRight的情况继续分为下面两种情况:如果mostRight的右孩子为null,则让mo原创 2020-12-22 13:46:18 · 747 阅读 · 1 评论 -
单调栈结构及其应用
文章目录单调栈结构及其应用解决的一般问题单调栈的应用:求最大子矩阵的大小单调栈的应用:可以看到烽火的山峰对单调栈结构及其应用解决的一般问题对于一个数组中的每个元素,求出该元素左边比它大同时距离它最近的数,以及该元素右边比它大同时距离它最近的数。暴力法的复杂度在O(n2),要求在O(n)的时间复杂度内完成。压入和弹出数据的规则:对于上面的一般问题,我们让一个栈从栈底到栈顶按从大到小的规则放入数据。从左往右遍历数组,对于一个数组元素num,如果栈为空或者num小于栈顶元素,num直接入栈,此时符合单原创 2020-12-05 21:42:54 · 194 阅读 · 0 评论 -
滑动窗口的最大值与最小值更新结构
滑动窗口的最大值与最小值更新结构数据结构–单调队列特点:队列中的元素全都是单调递增(或递减)的。应用:解决滑动窗口问题。实现:使用双端队列来实现单调队列的语义,在双端队列的头部和尾部都可以插入和删除元素,通过下面的插入和删除元素的逻辑来实现单调队列的语义。(注:在Java中双端队列Deque接口有两个主要的实现类:ArrayDeque和LinkedList,我们这里使用LinkedList实现类。)插入数据:在队尾插入一个元素,并把该元素前面比它小或者等于它的元素都删除掉。(为什么要删除掉前面小原创 2020-10-31 12:08:57 · 319 阅读 · 0 评论 -
BFPRT算法的主要步骤和代码实现
文章目录BFPRT算法的主要步骤和代码实现解决的问题解决方案BFPRT算法的步骤BFPRT算法的时间复杂度分析BFPRT算法的代码实现BFPRT算法的主要步骤和代码实现解决的问题求一个无序数组中第k小的数。约定:k是从1开始计数的,即最小的那个数是第一小的数。解决方案1、快速排序:平均时间复杂度O(nlogn),最坏时间复杂度O(n2)2、堆:时间复杂度O(nlogk)3、快速选择:平均时间复杂度O(n),最坏时间复杂度O(n2)例如:1, 2, 3, 4, 5,如果要求最5小的数,使用快速原创 2020-10-23 09:39:41 · 453 阅读 · 0 评论 -
Manacher算法的图示理解和代码实现
文章目录Manacher算法的图示理解和代码实现需要解决的问题第一种:暴力解法第二种:Manacher算法求解Manacher算法中的三个概念:Manacher算法中分四种情况讨论Manacher算法的代码实现Manacher算法的应用Manacher算法的图示理解和代码实现需要解决的问题寻找一个字符串中最长的回文子串。第一种:暴力解法思想:以i为起点,向两边扩展,寻找以i为中心的最长回文子串。复杂度:O(n2)补充:回文的形式有奇数回文和偶数回文,比如1221是偶数回文,12321是奇数回文原创 2020-10-19 15:18:02 · 1432 阅读 · 1 评论 -
KMP算法的图示理解和代码实现
文章目录KMP算法的图示理解和代码实现解决的问题理解KMP算法的前置知识:部分匹配表,即next数组。KMP算法的图示:关于next数组的求解示意图:KMP算法代码实现KMP算法的图示理解和代码实现解决的问题字符串包含问题,在str1中是否存在str2这样的子串,如果存在返回子串开始的位置。注意:子串和子序列的区别。理解KMP算法的前置知识:部分匹配表,即next数组。next数组的值:表示在某个位置i,对于i前面的字符串,这个字符串的前缀集合和后缀集合中,前缀和后缀相等时候的最大长度。例如:对原创 2020-10-18 17:04:05 · 229 阅读 · 2 评论 -
二叉树的三种遍历方式(递归和非递归)以及模拟计算机系统栈的遍历方式
二叉树的前序遍历–LeetCode144递归:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */import java.util.List;import java.util.ArrayList;class原创 2020-05-16 18:07:38 · 277 阅读 · 0 评论 -
正则表达式匹配问题的递归和动态规划解法
正则表达式匹配问题的递归和动态规划解法题目请实现一个函数用来匹配包含’. ‘和’ * ‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’ * '表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但与"aa.a"和"ab*a"均不匹配。递归解法:class Solution { ...原创 2020-04-24 19:09:34 · 405 阅读 · 0 评论 -
【LeetCode】Python3实现最长公共前缀和有效的括号
最长公共前缀编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “”。示例 1:输入: [“flower”,“flow”,“flight”]输出: “fl”示例 2:输入: [“dog”,“racecar”,“car”]输出: “”解释: 输入不存在公共前缀。说明:所有输入只包含小写字母 a-z 。方法一:水平扫描法先求出所有字符串长度最小值min...原创 2019-03-04 08:59:47 · 300 阅读 · 0 评论 -
【LeetCode】Python3实现回文数和罗马数字转整数
回文数判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。示例 1:输入: 121输出: true示例 2:输入: -121输出: false解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。示例 3:输入: 10输出: false解释: 从右向左读, 为 01 。因此它不是一个回文数。进阶:你...原创 2019-03-03 14:48:40 · 235 阅读 · 0 评论 -
【LeetCode】Python3实现两数之和和整数反转
两数之和要求:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]方法一:两...原创 2019-02-17 10:13:01 · 476 阅读 · 0 评论