![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 75
Rnan-prince
知是行之始,行是知之成(1352638748@qq.com)
展开
-
Python-AST语法树
在计算机科学中,AST),是源代码的抽象语法结构的树状表现形式,这里特指编程语言的源代码。AST是在处理源代码时所使用的一种中间表示形式,在编译和代码生成过程中起着关键作用。之所以说语法是「抽象」的,是因为这里的语法并不会表示出真实语法中出现的每个细节。AST中的每个节点表示源代码中的一个语法构造,如变量声明、表达式、函数调用、控制结构等。。例如,一个函数声明的AST节点可能包含多个子节点,如函数名、参数列表和函数体等。原创 2024-01-14 00:14:09 · 2301 阅读 · 0 评论 -
Hierholzer算法&重新安排行程
1、Hierholzer算法欧拉迹是指一条包含图中所有边的一条路径,该路径中所有的边会且仅会出现一次。一个无向图中包含欧拉迹,当且仅当下面两条性质同时满足:图是连通的 图中每个顶点的度均为偶数而一个有向图包含欧拉迹,当且仅当下面两条性质同时满足:图是连通的 图中每个顶点入度和出度相同Hierholzer算法用于在连通图寻找欧拉迹,其流程非常简单。从一个可能的起点出发,进...原创 2020-03-10 21:40:57 · 4433 阅读 · 0 评论 -
Rabin Karp算法 & 实现 strStr() 函数
实现strStr()函数给定一个haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回-1。示例 1:输入: haystack = "hello", needle = "ll"输出: 2示例 2:输入: haystack = "aaaaa", needle = "...原创 2020-04-05 20:27:07 · 305 阅读 · 0 评论 -
贪心法&跳跃游戏
1、跳跃游戏给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。示例1:输入: [2,3,1,1,4]输出: true解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。来源:力扣(LeetCode)链接:https://leetco...原创 2020-03-10 22:13:07 · 344 阅读 · 2 评论 -
前缀和应用总结
前缀和是一个数组的某项下标之前(包括此项元素)的所有数组元素的和。1、一维前缀和公式:sum[i] = sum[i-1] + a[i]根据上述表达式我们可以以O(1)求出区间[i,j]的区间和 : sum = [0]*(n+1) # 一般+1为了边界计算方便 for i in range(1, n+1): sum[i] = sum[i-1] + nums[i...原创 2020-03-07 22:37:02 · 1202 阅读 · 0 评论 -
Redis+bitmap的应用
BitMap是什么就是通过一个bit位来表示某个元素对应的值或者状态,其中的key就是对应元素本身。我们知道8个bit可以组成一个Byte,所以bitmap本身会极大的节省储存空间。Redis中的BitMapRedis从2.2.0版本开始新增了setbit,getbit,bitcount等几个bitmap相关命令。虽然是新命令,但是并没有新增新的数据类型,因为setbit等命令只不过是在set上的扩展。setbit命令介绍指令SETBIT key offset value复杂度O(..原创 2021-07-15 22:20:55 · 137 阅读 · 0 评论 -
java-处理IF-ELSE或switch太多
实现功能:根据不同的ID调用不同的函数,返回不同的内容,如果用if条件判断,显然很啰嗦1、初始化定义常量类:class IdTypeEnum { public static final String FIRST_ID_TYPE = "type1"; public static final String SECOND_ID_TYPE = "type2"; public static final String THIRD_ID_TYPE = "type3";}定义不同原创 2021-05-15 18:12:20 · 406 阅读 · 0 评论 -
java-固定长度的队列
实现一个队列,当尝试向队列中添加新元素并且它已满时,会自动从其头部驱逐一个元素。我们以仅追加方式插入元素的环。如果我们想要添加新元素的位置上有一个元素,我们只是覆盖给定位置的现有元素。package learn;import java.util.LinkedList;public class Test { public static void main(String[] args) { LimitedQueue<String> limitedQueue =原创 2021-05-15 15:16:54 · 2436 阅读 · 0 评论 -
LeetCode-1406-DP博弈问题应用
1406. 石子游戏 IIIAlice 和 Bob 用几堆石子在做游戏。几堆石子排成一行,每堆石子都对应一个得分,由数组 stoneValue 给出。Alice 和 Bob 轮流取石子,Alice 总是先开始。在每个玩家的回合中,该玩家可以拿走剩下石子中的的前 1、2 或 3 堆石子 。比赛一直持续到所有石头都被拿走。每个玩家的最终得分为他所拿到的每堆石子的对应得分之和。每个玩家的初始分数都是 0 。比赛的目标是决出最高分,得分最高的选手将会赢得比赛,比赛也可能会出现平局。假设 Alic.原创 2021-02-15 14:12:49 · 262 阅读 · 0 评论 -
LeetCode-滑动窗口的单调队列应用
1696. 跳跃游戏 VI难度中等31给你一个下标从0开始的整数数组nums和一个整数k。一开始你在下标0处。每一步,你最多可以往前跳k步,但你不能跳出数组的边界。也就是说,你可以从下标i跳到[i + 1, min(n - 1, i + k)]包含两个端点的任意位置。你的目标是到达数组最后一个位置(下标为n - 1),你的得分为经过的所有数字之和。请你返回你能得到的最大得分。示例 1:输入:nums = [1,-1,-2,4,-7,...原创 2021-02-15 11:55:41 · 349 阅读 · 0 评论 -
LeetCode-1713-最长递增子序列应用
1713. 得到子序列的最少操作次数给你一个数组target,包含若干 互不相同的整数,以及另一个整数数组arr,arr可能 包含重复元素。每一次操作中,你可以在 arr的任意位置插入任一整数。比方说,如果arr = [1,4,1,2],那么你可以在中间添加 3得到[1,4,3,1,2]。你可以在数组最开始或最后面添加整数。请你返回 最少操作次数,使得target成为arr的一个子序列。一个数组的 子序列指的是删除原数组的某些元素(可能一个元素都不删除...原创 2021-02-15 11:28:13 · 289 阅读 · 0 评论 -
字典树Trie
字典树又名前缀树(Prefix Tree)根节点不包含字符,除根节点外每一个节点都只包含一个字符; 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串; 每个节点的所有子节点包含的字符都不相同。Trie(前缀树) 的模板:.新建一个 TrieNode 的 class 用于表示 Trie 中的节点,包含 children 和 is_word 两个属性class ...原创 2020-03-24 00:46:33 · 877 阅读 · 0 评论 -
并查集Union Find
并查集:一种用于支持集合快速合并和查找操作的数据结构O(1) 合并两个集合- Union O(1) 查询元素所属集合- FindUnion Find 是一棵多叉树:1、并查集的实现1.1 底层数据结构父亲表示法,用一个数组/哈希表记录每个节点的父亲是谁。father[“Tom”] = “Nlear” father[“Jim”] = “Soox”1.2 查询所在集合...原创 2020-03-23 23:54:03 · 271 阅读 · 0 评论 -
序列化和反序列化二叉搜索树
序列化是将数据结构或对象转换为一系列位的过程,以便它可以存储在文件或内存缓冲区中,或通过网络连接链路传输,以便稍后在同一个或另一个计算机环境中重建。设计一个算法来序列化和反序列化二叉搜索树。 确保二叉搜索树可以序列化为字符串,并且可以将该字符串反序列化为最初的二叉搜索树。首先,定义二叉树:from collections import dequeclass TreeNode(o...原创 2020-03-23 22:46:50 · 254 阅读 · 0 评论 -
单调栈应用总结
单调栈单调递减栈:数据出栈的序列为单调递减序列 单调递增栈:数据出栈的序列为单调递增序列单调栈模板:for (遍历这个数组) if (栈空 || 栈顶元素>=或者<=当前比较元素): 入栈 else: while (栈不为空 && 栈顶元素<或者>当前元素) 栈顶元...原创 2020-03-07 21:26:26 · 517 阅读 · 0 评论 -
LeetCode-栈的用法-接雨水(python)
【接雨水】给定n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。示例:输入: [0,1,0,2,1,0,1,3,2,1,2,1]输出: 6来源:力扣(LeetCode)链接:https:/...原创 2020-02-02 14:02:55 · 568 阅读 · 0 评论 -
区间处理-会议室 II(python)
leetcode 253 Meeting Rooms II输入一个二维数组,数组的每个元素表示会议的开始时间和结束时间,问总共需要多少个会议室?https://leetcode-cn.com/problems/meeting-rooms-ii/解法1:区间排序法把区间变成2个数组:start时间数组和end时间数组,并对两个数组排序。然后一个指针遍历start数组,另一个指针指向en...原创 2020-02-02 08:58:52 · 967 阅读 · 0 评论 -
LeetCode-DFS模板-求解N皇后和数独问题
适用场景:输入数据:如果是递归数据结构,如单链表,二叉树,集合,则百分之百可以用深搜;如果是非递归数据结构,如一维数组,二维数组,字符串,图,则概率小一些。状态转换图:树或者DAG。求解目标:多阶段存在性问题。必须要走到最深(例如对于树,必须要走到叶子节点)才能得到一个解,这种情况适合用深搜。dfs模板:void dfs(input, path, result, cur) {...原创 2019-12-07 17:38:08 · 282 阅读 · 0 评论 -
二叉树的遍历(java&python)
1.Binary Tree Preorder Traversaljava:使用栈,时间复杂度O(n),空间复杂度O(n)public static void preOrderRec(Node root){ ArrayList<Integer> result = new ArrayList<>(); Stack<TreeNode> s ...原创 2019-09-27 00:33:45 · 201 阅读 · 0 评论 -
最长子序列&最长子串的题型汇总
1.最长公共子序列的长度题目:对于两个字符串,请设计一个高效算法,求他们的最长公共子序列的长度,这里的最长公共子序列定义为有两个序列U1,U2,U3...Un和V1,V2,V3...Vn,其中Ui<Ui+1,Vi<Vi+1。且A[Ui] == B[Vi]。给定两个字符串A和B,同时给定两个串的长度n和m,请返回最长公共子序列的长度。保证两串长度均小于等于300。...原创 2018-08-14 16:23:02 · 4224 阅读 · 2 评论 -
栈&队列&哈希表&堆-python
一、栈栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。栈的主要操作:push(),将新的元素压入栈顶,同时栈顶上升。 pop(),将新的元素弹出栈顶,同时栈顶下降。 empty(),栈是否为空。 peek(),返回栈顶元素。python通常实现栈只需要list就可以,list.append(val), list.pop()、list...原创 2019-11-09 02:25:16 · 1860 阅读 · 0 评论 -
双指针算法模板
什么是同向双指针? 什么是相向双指针?双指针的鼻祖题 —— 两数之和 TwoSum链表上的快慢指针算法快速排序 & 归并排序• 几乎所有 TwoSum变种 • Partition• Quick Select • 分成两个部分 • 分成三个部分• 一些你没听过的(但是面试会考的)排序算法一、相向双指针模板11、翻转字符串def reve...原创 2019-11-08 23:41:52 · 720 阅读 · 0 评论 -
单链表中的环(总结)
关于单链表中的环,一般涉及到的问题:1.给一个单链表,判断其中是否有环的存在;2.如果存在环,找出环的入口点;当fast和slow相遇时,slow还没有走完链表,假设fast已经在环内循环了n(1<= n)圈。假设slow走了s步,则fast走了2s步,又由于fast走过的步数 = s + n*r(s + 在环上多走的n圈),则有下面的等式:2*s = s + n ...原创 2019-11-08 23:12:23 · 2296 阅读 · 0 评论 -
二分查找(倍增法)
上期回顾:超全的二分查找汇总:https://blog.csdn.net/qq_19446965/article/details/82184672其余练习题1:https://www.cnblogs.com/rnanprince/p/11743414.html其余练习题2:https://www.cnblogs.com/rnanprince/p/11761940.html倍增法步骤...原创 2019-10-30 00:23:56 · 929 阅读 · 0 评论 -
BFS广度搜索及应用-单词接龙 II
给定两个单词(beginWord 和 endWord)和一个字典 wordList,找出所有从 beginWord 到 endWord 的最短转换序列。解释: endWord "cog" 不在字典中,所以不存在符合要求的转换序列。你可以假设 beginWord 和 endWord 是非空的,且二者不相同。终于过了,,,其实BFS还有好多的记忆搜索的优化,,不再赘述,,,更慢了,,,1分钟跑不完,,,要爆炸了。转换过程中的中间单词必须是字典中的单词。字典中不存在重复的单词。再审审题,,,我去,,,原创 2019-10-25 11:24:26 · 564 阅读 · 0 评论 -
SPFA 算法 & 网络延迟时间
SPFA(Shortest Path Faster Algorithm) 算法是Bellman-Ford算法的队列优化算法的别称,通常用于求含负权边的单源最短路径,以及判负权环。SPFA 最坏情况下复杂度和朴素 Bellman-Ford 相同,为 O(VE)。算法优点: 1.时间复杂度比普通的Dijkstra和Ford低。 2.能够计算有负权的图,...原创 2019-10-24 03:06:40 · 288 阅读 · 0 评论 -
背包问题汇总-01背包、完全背包、多重背包-java
一、01背包内容:有n件物品和容量为m的背包 给出i件物品的重量以及价值 求解让装入背包的物品重量不超过背包容量 且价值最大特点:每个物品只有一件供你选择放还是不放1. 二维解法 设f[i][j]表示前i件物品 总重量不超过j的最大价值 可得出状态转移方程: f[i][j]=max{f[i-1][j-w[i]]+v[i],f[i-1][j...原创 2018-08-01 23:05:41 · 5037 阅读 · 5 评论 -
基数排序、桶排序和计数排序的区别
1.桶排序(Bucket Sort)基本思路是:将待排序元素划分到不同的痛。先扫描一遍序列求出最大值 maxV 和最小值 minV ,设桶的个数为 k ,则把区间 [minV, maxV] 均匀划分成 k 个区间,每个区间就是一个桶。将序列中的元素分配到各自的桶。 对每个桶内的元素进行排序。可以选择任意一种排序算法。 将各个桶中的元素合并成一个大的有序序列。 假设数据是均匀分...原创 2018-08-08 23:51:17 · 23497 阅读 · 8 评论 -
超全的回文题汇总-Palindrome
最近做了好多回文类题目,一连串发现了好多,做了如下汇总:1.判断单链表是否是回文 - Palindrome Linked ListTime Complexity: O(n), Space Complexity: O(n) 使用快慢指针,每次快指针走两步,慢指针走一步。同时还要用栈,每次慢指针走一步,都把值存入栈中。等快指针走完时,链表的前半段都存入栈中了。最后慢指针继续往前走...原创 2018-08-08 19:03:31 · 662 阅读 · 1 评论 -
打印和为sum的组合,动规法+DFS+迭代法
一.判断是否有和为sum的组合,动规法,O(n^2)// 判断是否有和为n的组合,动规法,O(n^2)public static boolean findSum(int[] a, int n) { boolean[] dp = new boolean[n + 1]; for (int i = 0; i < a.length; i++) { if (a[i] >...原创 2018-08-17 12:46:11 · 795 阅读 · 1 评论 -
翻转句子Reverse Words in String
问题:将字符串中的单词们首位调换位置。Reverse words in string. Given an input string s, reverse the string word by word.For example, given s = “the sky is blue”, return “blue is sky the”.方法一:public static Strin...原创 2018-08-27 19:18:38 · 259 阅读 · 0 评论 -
超全的二分查找汇总(lower_bound&upper_bound)
相关内容:其余练习题1:https://www.cnblogs.com/rnanprince/p/11743414.html二分查找(倍增法):https://mp.csdn.net/postedit/102811021其余练习题2:https://www.cnblogs.com/rnanprince/p/11761940.html————————————————二分查找二分查找...原创 2018-08-29 16:04:30 · 1671 阅读 · 0 评论 -
什么时候用BFS,什么时候用DFS
BFS的缺点适用情况BFS的一般步骤:参考什么时候用DFS,什么时候用BFS?1、将初始点(一个或多个)加入队列 2、从队列头取出点,判断初始点的周边点,将符合条件的点加入队列尾部 3、重复2操作,直至队列为空。(一般每个点只加入队列一次)BFS的缺点:在搜索过程中,BFS必须要保存搜索过程中的状态,用于判重。注意,用于保存搜索过程的点的数据结构,要是hashset类型的...转载 2019-10-10 00:13:49 · 1294 阅读 · 0 评论 -
搜索,动态规划,二叉树的时间复杂度计算通用公式
搜索的时间复杂度:O(答案总数 * 构造每个答案的时间)举例:Subsets问题,求所有的子集。子集个数一共 2^n,每个集合的平均长度是 O(n) 的,所以时间复杂度为 O(n * 2^n),同理 Permutations 问题的时间复杂度为:O(n * n!)动态规划的时间复杂度:O(状态总数 * 计算每个状态的时间复杂度)举例:triangle,数字三角形的最短路径,状态总数约...转载 2019-10-09 23:59:35 · 3150 阅读 · 0 评论 -
DFS算法模板-排列组合-python
DFS算法模板:def dfs(array or root, cur_layer, path, result): if cur_layer == len(array) or not root: result.append(path) return for i in range(cur_layer, len(array)): ...原创 2019-10-09 23:50:08 · 1956 阅读 · 0 评论 -
线性探测再散列
哈希表又称散列表。哈希表存储的基本思想是:以数据表中的每个记录的关键字 k为自变量,通过一种函数H(k)计算出函数值。把这个值解释为一块连续存储空间(即数组空间)的单元地址(即下标),将该记录存储到这个单元中。在此称该函数H为哈函数或散列函数。按这种方法建立的表称为哈希表或散列表。处理冲突的方法:开放寻址法:Hi=(H(key) + di) MOD m, i=1,2,…, k(k<=...原创 2019-10-07 09:58:29 · 36497 阅读 · 22 评论