数据机构与算法
文章平均质量分 58
REN_林森
开始学习并记录Java后端方向的知识。
展开
-
Java之字符串全排列
通过对字符串的全排列,来理解回溯。原创 2021-11-15 14:42:50 · 1208 阅读 · 0 评论 -
Java之有限状态机
HashMap、位运算、有限状态机,顾名思义有限个状态在事件的触发下做出相应状态的转换。原创 2021-11-02 20:38:34 · 2490 阅读 · 1 评论 -
剑指offer.10-II.青蛙跳台阶问题之一维dp、二维dp、O(logn)的矩阵幂
剑指offer.10-II.青蛙跳台阶问题之一维dp、二维dp、O(logn)的矩阵幂原创 2021-10-16 21:58:52 · 161 阅读 · 0 评论 -
等差子数组[O(n)判断数组是否为等差数列]
如何判定一个数组是否为等差数列,可以直接排序O(nlogn),再不断求相邻数之间的差值,通过前后差值一致+传递性,完成等差数列的判定。但这没有充分利用等差数列的特性,强行将数排序,不如把每个数在等差数列的位置记下来,实现空间换时间。原创 2023-03-24 17:29:57 · 353 阅读 · 0 评论 -
分割两个字符串得到回文串[抽象--去除具体个性取共性需求]
抽象去个性留共性,是因为具体个性对于解决问题是个累赘。少了累赘,直击需求,才能进行问题转换或者逻辑转换。原创 2023-03-18 20:11:52 · 561 阅读 · 0 评论 -
给定行和列的和求可行矩阵[算法题的两种思考路径]
算法题的两种思考路径前言一、给定行列和限定求可行矩阵二、分析问题,寻找思考逻辑总结参考资料前言对于算法题,有时没顾太多细节,凭对题型的直觉就知道用什么方法,然后求解。但碰到从未遇到过,或者说无强烈固定套路可循的算法题,就需要分析问题,并记录下来,寻找规律和思考角度,完成方案的制定。可先凭直觉解题,再凭分析把题理解透彻。一、给定行列和限定求可行矩阵二、分析问题,寻找思考逻辑// 通过整体限制,寻找局部元素的可能性。// 有行和,有列和,找元素。// 一维情况下,有行和,如何寻找元素(非负),先原创 2023-03-14 21:29:19 · 171 阅读 · 0 评论 -
使数组和能被P整除[同余定理+同余定理变形]
同余定理非常经典,采用前缀和 + map,当两个余数前缀和为一个值时,则中间一段子数组刚好对P整除。但是能否找到前面是否有一段子数组和可以对P整除呐?反向思考,找map[P - mod]就知道中间一段子数组和对P取余为mod,前面一段子数组和对P取余为0.原创 2023-03-10 19:48:24 · 591 阅读 · 0 评论 -
节点间通路[go 使用队列记录]
在图中,寻找起点到目标点的步数/是否存在路径相关,bfs相对dfs更快,毕竟空间换时间了,双向bfs会更快一点,毕竟一层一层的扩展起来非常大,队列要存太多元素。原创 2023-03-09 11:05:55 · 100 阅读 · 0 评论 -
花括号展开II[栈模拟dfs]
递归调用,代码非常的简洁。但是可以通过显式栈来模拟栈中的内容,锻炼自己的代码能力,清楚知道栈帧中需要的内容。原创 2023-03-08 22:53:02 · 286 阅读 · 0 评论 -
使字符串平衡的最少删除次数[动态规划+状态压缩+中心划分思想]
动态规划,就是把问题分解成相同性质规模越小的递推问题,而有时候不仅仅是知道当前的什么状态就可以了,有时候需要对当前进行细分类,从而变成二维dp,或者高维dp。除此之外,中心划分思想也是一个经典的算法思想。原创 2023-03-06 22:33:31 · 146 阅读 · 0 评论 -
按位与为零的三元组[掩码+异或的作用]
当a + b = 0时,我们能够很清楚的知道b是个什么值,b = 0 - a = -a,如果当a & b = 0时,我们能够很清楚的知道b是什么值吗?原创 2023-03-04 15:50:05 · 449 阅读 · 0 评论 -
阶乘后的零[挖掘规律+动态规划]
想要计算阶乘后的0有多少,可以直接算出阶乘值,再不断对10取余。但是如果n比较大,这种方法是根本行不通的,只能挖掘规律。原创 2023-02-28 23:44:05 · 131 阅读 · 0 评论 -
交换字符使得字符串相同[贪心]
贪心算法,必须先看清楚有哪些选择,才能在这些选择的基础上进行贪心,做最优选择,除此之外,还得看局部最优会不会形成全局最优,否则无法贪心。原创 2023-02-25 12:37:11 · 330 阅读 · 0 评论 -
按字典序排列的最小的等价字符串[拆解并查集]
并查集有什么用?并查集是什么?搞懂这两个问题,相关的并查集问题就变得非常easy!原创 2023-02-24 23:06:00 · 665 阅读 · 0 评论 -
回文子串的数量[寻找回文子串的完整思路过程]
回文字符串,就是从左遍历和从右遍历的字符是相同顺序的,转换一下,就是该字符串是对称的。寻找回文子串面临两个直接的问题,1-如何确定一个子串?2-如何判断该子串是否为回文串?原创 2023-02-20 12:19:53 · 961 阅读 · 0 评论 -
最大平均通过率[优先队列]
优先队列的本质是,一个堆 + FIFO的队列,即一个可以有序出队的队列。而使用优先队列最关键的点就是堆的比较规则。原创 2023-02-19 10:32:10 · 66 阅读 · 0 评论 -
表现良好的最长时段[前缀和思想&子数组]
对于子数组/子串问题,紧密连续前缀和/滑动窗口/单调栈;挖掘内在规律,可以简化代码,降低时空复杂度或消耗量。原创 2023-02-15 18:07:50 · 251 阅读 · 0 评论 -
替换子串得到平衡字符串[map计数+滑动窗口]
对于子串问题,确定左边界和有边界,就能确定一个子串,暴力取子串,时间复杂度O(n2)。有时挖掘内在规律的限定,或者问题所限定,就可以采用滑动窗口寻找子串,时间复杂度O(n)。原创 2023-02-13 22:15:20 · 287 阅读 · 0 评论 -
字母板上的路径[提取公共代码,提高复用率]
写代码,在提高效率的同时,要方便人看,这个人包括自己。大函数要拆分成一些小函数,让每个函数的宏观目的和步骤都显得清晰,读起来才容易懂。除此之外,拆分也有讲究,提取公共代码,尽量减少重复无意义的代码,提高复用率。原创 2023-02-13 14:08:35 · 314 阅读 · 0 评论 -
装满杯子需要的最短时长[贪心模拟 || 全局贪心]
碰到局部选择,加上结果最值导向,基本就是不断最优解直到求到全局最值,经典的贪心思维,不断选择最优方向,就是一种贪心模拟;而有些问题,可以做到全局角度观察,挖掘其数学规律,以常数级复杂度完成贪心求解。原创 2023-02-12 13:03:00 · 266 阅读 · 0 评论 -
两数之和三数之和之双指针练习
针对数组,双指针可能会有更低的时空复杂度,甚至是解题关键,对于两数之和、三数之和,它们逻辑是一样的,即将三数向右一项一位。原创 2022-02-24 18:43:43 · 149 阅读 · 0 评论 -
路径总和[在二叉树上做前缀和]
前缀和思想是快速解决一段连续抽象Node(可以是数组元素/树节点)的抽象操作(可以是和/差/自定义操作)。原创 2023-02-10 13:19:57 · 139 阅读 · 0 评论 -
设计一个验证系统[LRU思想--双向链表+hash]
设计一个验证码系统,给定生成的验证码和时间,主要设计精力集中在有效验证码的数据结构设计,要求存储好生成的验证码;可重置任何未过期的验证码;统计未过期的验证码数量。原创 2023-02-09 15:20:38 · 131 阅读 · 0 评论 -
删除子文件夹[字典树 + go变量 + strings.builder的copyCheck()]
字典树;panic: strings: illegal use of non-zero Builder copied by value原创 2023-02-08 20:16:42 · 245 阅读 · 0 评论 -
分割等和子集[问题转换&限定的01背包]
01背包是动态规划的基础,解决特定的问题,而有的相关算法问题内部潜藏本质问题,需要做到问题转换,问题联系,然后用基础知识解决问题。原创 2023-02-07 15:26:33 · 84 阅读 · 0 评论 -
行列有序矩阵搜索[二分 && Z字搜索]
从矩阵中搜索一个元素,暴力搜索O(mn)。如果行列有序,则可二分 + 剪枝来进行搜索。除此之外,利用行列同时有序,在搜索的过程中将可搜索空间压缩,直至找到target,为Z字搜索O(m + n)。原创 2023-02-06 18:56:50 · 117 阅读 · 0 评论 -
计算布尔二叉树的值[叶子节点的巧妙判断方式]
后序遍历,逻辑转换。原创 2023-02-06 13:24:34 · 484 阅读 · 0 评论 -
乘积最大子数组[前缀积 + 内在规律限定下的逻辑转换]
前缀积 & 逻辑转换原创 2023-02-05 14:31:48 · 390 阅读 · 0 评论 -
生成平衡数组的方案数[抽象前缀和思想]
空间换时间,利用前缀和快速获得一段子数组的和,或者抽象一段子数组,比如不一定全加,可以加减交替。原创 2023-01-29 15:22:33 · 72 阅读 · 0 评论 -
比特位计数[动态规划 || bitCount计数]
二进制计数可以直接基于分治去快速统计,如果是连续数的二进制计数,可以利用前面已经计算出的状态进行递推求解,即动态规划。原创 2023-01-13 11:03:25 · 586 阅读 · 0 评论 -
颠倒二进制[位运算]
颠倒二进制,可以直接将二进制逆序存储,得到新的数;也可分治快速颠倒。原创 2023-01-11 21:17:37 · 558 阅读 · 0 评论 -
朴素梯度下降
对于求局部最优解的情况,可采用梯度下降逼近最小值。这也是机器学习最基本的东西。原创 2023-01-11 21:11:10 · 75 阅读 · 0 评论 -
阿拉伯数转中文与英文[找到规律,抽象问题,转换成代码]
如果思考算法的解法方案是一种模拟,那么这一般不是个好的解决方案。对于一个复杂的问题,挖掘其中的规律,把问题抽象处理统一解决,这样代码才会简洁清晰。原创 2023-01-11 20:41:42 · 544 阅读 · 0 评论 -
缀点成线[巧用变量抽象问题->统一操作]
验证所有点在一条直线上,只需确定y=kx + b的k与b即可,但是k可能是无穷大,即直线垂直的时候。将函数抽象为x=0*y + b,这样还不够抽象,将x/y都视为一个变量时,两种情况对调传递变量即可统一操作。原创 2023-01-11 14:45:46 · 43 阅读 · 0 评论 -
如何求解欧拉路径?
欧拉路径 == 从图的一个节点出发,每条边只访问一次,遍历完了所有图节点,这条路径为欧拉路径。原创 2022-12-15 13:45:36 · 834 阅读 · 0 评论 -
如何解hard算法题?
困难题就是一个个简单的知识点组成,加上其内在的逻辑联系。所以一个困难题,应该是先观其规律,再进行逻辑转换问题,再拆解小问题,用积累的知识点解决。当然,如果没有积累到/思考角度不对,就看题解,多调研,别浪费时间!原创 2022-12-03 13:26:47 · 664 阅读 · 0 评论 -
Java.Integer.bitCount(int)源码解析
如何求解一个二进制中1的个数?有常规的O(N)法,还有基于分治的O(logN),即Java的bitCount(int)方法。原创 2022-11-29 12:14:13 · 618 阅读 · 0 评论 -
汉诺塔问题 [递归 + 抽象]
汉诺塔问题,是学习递归的第一个算法题,也是非常经典的递归问题。由于它是双递归问题,所以初学时不易理解。但只要带着抽象的思考方式去分析,就能很容易理解多递归问题。原创 2022-10-25 11:35:41 · 613 阅读 · 0 评论 -
目标和 [从暴力dfs -> 状态记录 -> 动态递推 -> 状态压缩]
从数组中找多个数字,其之和等于target,一般的思想就是dfs进行组合。但耗时太多,则可以将dfs中重复计算的地方进行记录,空间换时间,即记忆搜索法。但这种记忆搜索法只记录了一些重复计算的地方,还没将空间换时间发挥到极致。此时可动态递推来完成求解,即动态规划。动态规划中的状态往往是层层递推的,所以在空间上可以做到进一步优化,即动态压缩。原创 2022-09-30 11:03:44 · 302 阅读 · 0 评论 -
不同路径 [DFS记忆化数组 & 动态规划]
DFS作为深度优先遍历,经常碰到需要一节点多次被遍历的情况,导致时间复杂度呈指数级。往往重复遍历目的就不是单词的访问节点了,而是需要该节点到某终点的一种状态(抽象),可用变量记录该节点的状态,将下一次dfs终止在此处,大大降低时间复杂度,这就是记忆化搜索。而记忆化搜索往往和动态规划关联。原创 2022-09-21 22:17:04 · 199 阅读 · 0 评论