
算法与数据结构
文章平均质量分 80
马各阿牛
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
LeetCode 229场周赛 - 区间DP + 最长公共子序列
1770.Maximum Score from Performing Multiplication OperationsYou are given two integer arraysnumsandmultipliersof sizenandmrespectively, wheren >= m. The arrays are1-indexed.You begin with a score of0. You want to performexactlymoperat...原创 2021-02-27 21:48:22 · 246 阅读 · 0 评论 -
DFS - 开数组记录路径 - Tree of Coprimes(hard) - Biweekly Contest 46
There is a tree (i.e.,a connected, undirected graph that has no cycles) consisting ofnnodes numbered from0ton - 1and exactlyn - 1edges. Each node has a value associated with it, and therootof the tree is node0.To represent this tree, you are ...原创 2021-02-21 10:23:34 · 235 阅读 · 0 评论 -
[算法] leetcode-228周赛 - 困难题 - 建图技巧
1761. 一个图中连通三元组的最小度数难度困难8收藏分享切换为英文接收动态反馈给你一个无向图,整数n表示图中节点的数目,edges数组表示图中的边,其中edges[i] = [ui, vi],表示ui和vi之间有一条无向边。一个连通三元组指的是三个节点组成的集合且这三个点之间两两有边。连通三元组的度数是所有满足此条件的边的数目:一个顶点在这个三元组内,而另一个顶点不在这个三元组内。请你返回所有连通三元组中度数的最小值,如果图中没有连通三元组,那么返回...原创 2021-02-20 21:28:59 · 215 阅读 · 0 评论 -
算法 - 数学 - 组合数 - 隔板法求组合数
一、求组合数二、隔板法 隔板法是組合數學的方法,用來處理n個無差別的球放進k個不同的盒子的問題。可一般化為求不定方程的解數,並利用母函數解決問題。 隔板法與插空法的原理一樣。 应用隔板法必须满足3个条件: 这n个元素必须互不相异; 所分成的每一组至少分得1个元素; 分成的组别彼此相异。基本例子 把10个相同的小球放入3个不同的箱子,每个箱子至少一个,问有几种情况? 分析: 10个相同的小球, 中间有9个空格可以插入板,...原创 2021-01-24 17:02:41 · 1129 阅读 · 0 评论 -
最长公共子序列转化为最长上升子序列
leetcodehttps://leetcode.com/problems/minimum-operations-to-make-a-subsequence/1713.Minimum Operations to Make a SubsequenceYou are given an arraytargetthat consists ofdistinctintegers and another integer arrayarrthatcanhave duplicates.In o...原创 2021-01-03 21:05:56 · 327 阅读 · 1 评论 -
彻底弄懂, n个人n个座位,求不能坐在自己座位上种数 (伯努利信封问题)
原创 2020-12-23 22:28:16 · 2504 阅读 · 0 评论 -
基础算法 - 树的直径
题目地址:https://leetcode-cn.com/problems/tree-diameter/1245. 树的直径难度中等48收藏分享切换为英文接收动态反馈给你这棵「无向树」,请你测算并返回它的「直径」:这棵树上最长简单路径的边数。我们用一个由所有「边」组成的数组edges来表示一棵无向树,其中edges[i] = [u, v]表示节点u和v之间的双向边。树上的节点都已经用{0, 1, ..., edges.length}中的数做了标记,每个节点上的标记都...原创 2020-10-15 16:54:10 · 830 阅读 · 0 评论 -
算法 - 常用技巧
动态维护区间352. 将数据流变为多个不相交区间https://leetcode-cn.com/problems/data-stream-as-disjoint-intervals/原创 2020-08-23 21:04:23 · 295 阅读 · 0 评论 -
KMP - 字符串匹配 - 使用技巧
一. 使用KMP查找最长回文前缀的长度例如: 求字符串catacb的最长回文前缀的长度技巧: 假设字符串为s, 求s + # + reverse(s) 的ne数组求得最后的ne数组的值为5, 那么5刚好就是最长回文前缀的长度时间复杂度: O( 2 * n )题目: leetcode 214 最短回文串...原创 2020-08-07 16:25:51 · 171 阅读 · 0 评论 -
倍增算法
题目树节点的第 K 个祖先来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/kth-ancestor-of-a-tree-node给你一棵树,树上有 n 个节点,按从 0 到 n-1 编号。树以父节点数组的形式给出,其中 parent[i] 是节点 i 的父节点。树的根节点是编号为 0 的节点。请你设计并实现 getKthAncestor(int node, int k) 函数,函数返回节点 node 的第 k 个祖先节点。如果不存在..原创 2020-07-29 12:32:23 · 564 阅读 · 0 评论 -
动态规划 - 笔记
class Solution { public boolean isMatch(String s, String p){ StringBuilder sb = new StringBuilder(); char[] cs = p.toCharArray(); for(int i = 0; i < cs.length; i++){ while(i < cs.length - 1 && cs[...原创 2020-06-30 14:37:18 · 207 阅读 · 0 评论 -
动态规划 - Dp - 最长上升子序列
LeetCode -面试题 17.08. 马戏团人塔 dp暴力做法 - 超时 O (N ^ 2)class Solution { public int bestSeqAtIndex(int[] height, int[] weight) { int n = height.length; if(n == 0) return 0; int[] dp = new int[n + 1]; ...原创 2020-06-27 16:38:42 · 304 阅读 · 0 评论 -
基础算法四 - 数学基础
1. 求1 ~ n中约数的个数2. 字符串hashP = 131 或 13331数组int[] h, ph[i] 为字符串hash值的前缀和 h[i] = h[i - 1] * P + w.charAt(i - 1); //w.charAt(i - 1)实际上是第i个字符p[0] = 1; p[i] = p[i - 1] * P;cong下标L到R的字符串...原创 2020-05-06 21:17:11 · 230 阅读 · 0 评论 -
基础算法三 - 搜索与图论
这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Ma...原创 2020-05-03 10:08:29 · 497 阅读 · 0 评论 -
二叉树的前、中、后序遍历模板 - 迭代版
前序遍历:public List<Integer> preorderTraversal(TreeNode root) { ArrayList<Integer> rs = new ArrayList<>(); Stack<TreeNode> stack = new Stack(); while(ro...原创 2020-03-28 16:26:23 · 480 阅读 · 0 评论 -
字典树(Trie Tree)java 模板
class Trie { /** Initialize your data structure here. */ TrieNode root; public Trie() { root = new TrieNode(); } /** Inserts a word into the trie. */ public void ...原创 2020-03-28 16:21:32 · 372 阅读 · 0 评论 -
力扣刷题笔记
C类型题:76 (slide windows)原创 2020-02-13 15:17:57 · 801 阅读 · 0 评论 -
leetcode刷题----数组子集--回溯算法
78 public List<List<Integer>> subsets(int[] nums) { List<List<Integer>> list = new ArrayList<>(); Arrays.sort(nums); backtrack(list, new A...原创 2020-01-22 16:42:44 · 242 阅读 · 1 评论 -
动态规划的框架(套路), 总结
动态规划题目千变万化,很多人刚入门时候都觉得非常难以理解,题目越做越挫,越做打击越大,看着别人的题解,心里只能默念一句卧槽,这都能写出状态方程! 走了那么多弯路,才发现问题所在,主要原因是因为基础的东西没掌握好,力扣上很多题目都是从这些基础的套路演变出来的,把基础问题的状态方程掌握和理解好,自己自然也就能写出其他题目的状态方程了。 所谓一生二,二生三,三生万物,把这一、...原创 2019-12-23 17:09:37 · 1049 阅读 · 0 评论 -
算法 - 双端队列结构 - JAVA
一、为什么双端队列和双向链表是同一个数据结构双端队列:就是Java里自带的:LinkedList list = new LinkedList();为什么java要把队列和双向链表弄成一个数据结构呢?我们来假设双端队列是一个数据结构,双向链表也是单独一个数据结构。对比双端队列和双向链表主要提供方法:双端队列 双向链表 1. 头结点的入队、出队 1.头节点的新...原创 2019-11-03 10:12:56 · 203 阅读 · 0 评论 -
LeetCode刷题笔记-JAVA
非科班艰难的刷题之路,目前刷到200题,本文记录技巧性较高的题目。Round 1 713. 乘积小于K的子数组给定一个正整数数组nums。找出该数组内乘积小于k的连续的子数组的个数。示例 1:输入: nums = [10,5,2,6], k = 100输出: 8解释: 8个乘积小于100的子数组分别为: [10], [5], [2], [6], [10,5], [...原创 2019-11-02 22:23:13 · 656 阅读 · 1 评论 -
算法-MANACHAR 求最长回文串 JAVA版本
一、背景 Manachar主要是为了处理回文串问题,回文串的定义不再赘述。一般来讲,判定一个字符串中的子串是否是回文串,常规的方法是遍历字符串的每一个字符,然后向左右扩展,这样可以判定是否是回文串、回文串的长度,以及字符串中最长的回文子串是什么。这样的方法比较暴力,算法复杂度是O(n2),实际使用上是比较慢了。1975年,Manachar发明了Manachar算法,能以的算法复杂度O(n...原创 2019-10-27 21:37:16 · 172 阅读 · 0 评论 -
算法 - TOP-K (BFPRT算法) JAVA版本
一、背景在一大堆数中求其前k大或前k小的问题,简称TOP-K问题。而目前解决TOP-K问题最有效的算法即是BFPRT算法,其又称为中位数的中位数算法,该算法由Blum、Floyd、Pratt、Rivest、Tarjan提出,最坏时间复杂度为O(n)O(n)。在首次接触TOP-K问题时,我们的第一反应就是可以先对所有数据进行一次排序,然后取其前k即可,但是这么做有两个问题:(1):快速排...原创 2019-10-27 12:07:47 · 715 阅读 · 0 评论 -
Java int数组来表示bit数组
众所周知,一个int类型占4个字节,也就是32个bit,那么,如何使用int数组来表示bit数组呢?如: 新建一个int数组: int[] arr = new int[100];该数组占100*32 = 3200个bitbit位数字不是0就是1,假设我需要将第3000位从0置位1,那么如何操作呢?代码如下:int indexBucket = 3000 / 32; /...原创 2019-10-19 17:36:29 · 1345 阅读 · 0 评论 -
前 K 个高频元素, 求Top N
给定一个非空的整数数组,返回其中出现频率前k高的元素。示例 1:输入: nums = [1,1,1,2,2,3], k = 2输出: [1,2]示例 2:输入: nums = [1], k = 1输出: [1]说明:你可以假设给定的k总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。你的算法的时间复杂度必须优于 O(n log n) ,n是...原创 2019-10-08 22:09:57 · 228 阅读 · 0 评论