创作不易,感觉有帮助到你,可以顺手star
用产品思维帮助更多的人学习算法 更多的为用户考虑而写的一个仓库
用老罗的话 彪悍的人生不需要解释 挑一点恶心的干干 先开始写算法,像打造产品一样写一个算法仓库, 帮助更多的人学习算法,同样也是自我学习的过程
Java写的算法仓库 算法最重要的是心得
准备做一个长期的算法仓库 ,像阿甘一样做个傻子,不停奔跑,每天学习一个算法,复利思维
日拱一卒,功不唐捐
把人生比作公司或者游戏的话 , 我准备长期做的事情,一个是跑步锻炼身体,一个阅读书籍(技术类,非技术类书籍),一个就是这个算法仓库了
纸上得来终觉浅 ,绝知此事要躬行
三部曲: 模仿,学习, 超越
高筑墙 , 广积粮 , 缓称王
天道酬勤,勤能补拙。博观而约取,厚积而薄发
算法: 先把一个大问题拆解成一个个小问题 , 再解决小问题 , 小问题解决了拼接起来解决大问题
磨刀不误砍柴工, 磨石不误磨刀工
坚持下去,会有突然间成长的一天
自顶向下 ,逐步求精
费曼算法: 1.将问题写下来 2. 好好思考 3.将答案写下来
最笨的学习方法 就是把抄袭一遍也是最聪明的办法,遇到晦涩难懂的知识,大脑一下子接受不了,抄袭一遍之后,大脑慢慢接受
二叉树问题大多使用递归解决 递归几大要素: 1.基线条件(终止条件) 2.子问题 3.递归参数 4. 递归返回值 、
二叉树前序遍历 // 力扣
二叉树前序遍历题解 :Solution 1. 根结点 —> 左子树 —> 右子树 2. 单层条件是先根节点,左节点 右节点 后使用递归 ,递归的基线条件是:root节点==null 终止
二叉树中序遍历 // 力扣
二叉树中序遍历:MiddleSolution : 题解: 左子树——根节点——右子树 迭代解法 :1. while 2 .入栈 3. 出栈
平衡二叉搜索树 : AVLTree 关键字1. LL 右旋 2.RR 左旋 3.LR 先左旋 再右旋 4 RL 先右旋 再左旋
二叉堆:BinaryHeap 数学要好 1. 父节点的下标是P 他的左孩子下标就是 2P+1 2P+2 2. 最大堆上浮,跟自己的父节点对比 , 比父节点大上浮, 不断对比
优先队列: PriorityQueue 题解:插入进行上浮操作 删除进行:最后一个替换到堆顶 , 然后进行下沉操作
二叉树层序遍历 // 力扣
二叉树层序遍历:LevelOrder 题解 : 先把父节点放入队列 , 然后遍历队列 , 遍历子节点 加入数值
二叉树的锯齿形层序遍历 // 力扣
二叉树的锯齿形层序遍历: zigzagLevelOrder 题解 : 利用双端队列锯齿形层次遍历
二叉树的深度
平衡二叉树 思路: 左右子树 深度差超过 1 它就不是平衡二叉树
翻转二叉树 思路: 左右子树 深度差超过 1 它就不是平衡二叉树
二叉树- 合并二叉树
二叉树- 路径之和
另一颗树的子树
统计左叶子节点的和
二叉树中第二小的节点
非递归的前序遍历
非递归的右序遍历
非递归的中序遍历
修剪二叉搜索树
二叉搜索树中第K小的元素
把二叉搜索树转换为累加树
二叉搜索树的最近公共祖先
二叉树的最近公共祖先
将有序数组转换成二叉搜索树
有序的链表转换二叉搜索树
两数之和 IV - 输入 BST
二叉搜索树的最小绝对差
二叉搜索树中的众数
二叉树的镜像 // 力扣
相同的树 // 力扣
二叉树的最小深度 // 力扣
平衡二叉树 // 力扣
输出二叉树的右视图 // 牛客
二叉树根节点到叶子节点的所有路径和 // 牛客
验证二叉搜索树 // 力扣
二叉树的完全性检验 // 力扣
判断一棵二叉树是否为搜索二叉树和完全二叉树 // 牛客
二叉树中的最大路径和 // 力扣 // 牛客
二叉树的右视图 // 力扣
从前序与中序遍历序列构造二叉树 // 力扣
366. 寻找二叉树的叶子节点 // 力扣
三数之和:ThreeNum 主要思路: 1.先排序 2.遍历每一个元素 3. 使用双指针
股票问题:StockProfit 如何获得最大收益 思路: 记录最小值 ,差值较大的覆盖之前的
缓存淘汰算法: LruCache 维护一个双向链表 ,一个hashMap 核心使用双链表记录最近使用和最久未使用的元素 ,若容量已满,淘汰最久未使用的key
最小栈的实现 : MinStack 加一个辅助栈记录最小值 辅助很重要
寻找两个数之和: FindSumNumbers 先构建map 然后再遍历
数组中的第k个最大元素:KthlargestNumber 题解: 1. 把数组的前K个元素构建成最小堆 2.下沉操作保持堆的有效性
用栈实现队列 :MyQuene 解题: 将一个栈当作输入栈,用于压入 \texttt{push}push 传入的数据;另一个栈当作输出栈
寻找全排列的下一个数子: DictOrderAlgo 1. 从后向前查看逆序区域 ,找到逆序区域的前一位, 也就是数字置换的边界
2. 让逆序区域的前一位和逆序区域中大于他的最小的数字交换位置
3. 把原来的逆序区域转为顺序状态
删除K个数字的最小值: RemoveKDigits 题解: 简化问题:如果只删除一个数字 ,如何让新整数的值最小 找出降序数字删除
字符串匹配算法(RK算法):RabinKarp 题解: 比较两个字符串的hash
KMP算法: Kmp 题解: KMP算法的整体思路:在已匹配的前缀当中寻找最长可匹配后缀子串和最长可匹配前缀子串 ,在下一轮直接把两者对齐,从而实现模式串的快速移动
迪杰斯特拉 : Dijkstra 思路: 维护一个距离表, 标记是否最短距离 ,动态规划更新最短距离表
LRU缓存机制 // 力扣 牛客
合并两个有序数组 // 牛客
面试题7:重建二叉树
面试题8:二叉树的下一个节点
面试题9:用两个栈实现队列
面试题27:二叉树的镜像
面试题28:对称的二叉树
面试题30:包含min函数的栈
面试题31:栈的压入,弹出序列
面试题32:从上到下打印二叉树
面试题33: 二叉搜索树的后序遍历序列
面试题34: 二叉树中和为某一值的路径
面试题36: 二叉搜索树与双向链表
面试题38: 字符串的排列
面试题40: 最小的K个数
面试题40: 连续子数组的最大和
面试题45: 把数组排成最小的数
面试题46: 把数字翻译成字符串
面试题47: 礼物的最大价值
面试题48: 最长不含重复字符的子字符串
面试题50: 第一个只出现一次的字符
面试题51: 数组中的逆序对
面试题52:两个链表的第一个公共节点
面试题53:在排序数组中查找数字
面试题54:二叉搜索树的第K大节点
面试题55:二叉树的深度
面试题56:数组中数字出现的次数
面试题57:和为s的数字
面试题58:翻转转字符串- 翻转单词顺序
面试题59:队列的最大值 MaxQueue
面试题60:n个骰子的点数
面试题61:扑克牌中的顺子
面试题62:圆圈中最后剩下的数字
面试题63:股票的最大利润
面试题67:把字符串转换成整数
面试题68:树中两个节点的最低公共祖先
实现二叉树先序,中序和后序遍历 // 牛客
二叉树的最小深度 // 力扣
二叉树的最大深度 // 力扣 // 牛客
二叉树中和为某一值的路径 // 力扣 // 牛客
二叉搜索树中两个节点之和 // 力扣
二叉树的锯齿形层序遍历 // 力扣
平衡二叉树 // 力扣 // 牛客
重建二叉树 // 力扣 // 牛客
二叉搜索树的后序遍历序列 // 力扣 // 牛客
将有序数组转换为二叉搜索树 // 力扣
后继者:设计一个算法,找出二叉搜索树中指定节点的“下一个”节点(也即中序后继)
二叉搜索树的后序遍历序列 // 力扣 // 牛客
二叉树的最近公共祖先 // 力扣 // 牛客
按之字形顺序打印二叉树 // 力扣 // 牛客
二叉树的镜像 // 力扣 // 牛客
二叉树的层序遍历 II // 力扣
二叉树的所有路径 // 力扣
####递推三部曲
递推三部曲 * 1. 边界条件 * 2. 递推公式 * 3. dp数组取值 * 套路 ; dp[i][j] 往往依赖 dp[i][i-1] dp[i-1][j] dp[i-1][j-1] 只要是动态规划就依赖这三个
发现规律 算法核心 有什么条件 要达到什么目的 例如:回文字符串要求是正读反读结果都是一样的句子 隐含条件 偶数个字符的话 每个字符都是成对出现的 奇数字符的话 只有一个字符是单独一个的 , 其他字符都是成对出现的
回溯法是一种复杂度很高的暴力算法 ,实现简单且有固定模板 。 不同于普通的暴力搜索 ,回溯法会在每一步判断状态是否合法,而不是等到状态全部生成后再进行确认
回溯讲的非常好的题解
单调栈
单调栈牛客题解
229.求众数-ii.java
84.柱状图中最大的矩形.java // 力扣题解
42.接雨水.java // 力扣题解
739.每日温度.java
496.下一个更大元素-i.java
25.k-个一组翻转链表.java // 力扣题解 // 力扣题解-递归解法
数据结构的底层存储方式只有两种:数组(顺序存储)和链表(链式存储)。
数据结构是工具 ,算法是通过合适的工具解决特定问题的方法
计算机解决问题其实没有任何特殊技巧,它唯一的解决办法就是穷举
回溯算法框架:解决一个回溯问题,实际上就是一个决策树的遍历过程
动态规划分为一下几步
*找到"状态"和"选择"
*明确dp数组/函数的定义
前面多次强调过,很显然只要涉及求最值,没有任何技巧,一定是穷举所有可能的结果,然后对比得出最值
关于"状态"的穷举,最重要的一点就是:状态转移所依赖的状态必须被提前计算出来
经典动态规划 0-1背包问题
416.分割等和子集.java
完全背包问题
518.零钱兑换-ii.java 力扣题解
二叉树算法的设计总路线:明确一个节点要做的事情,然后剩下的事抛给递归框架
####二叉搜索树操作集锦
98.验证二叉搜索树.java
700.二叉搜索树中的搜索.java
701.二叉搜索树中的插入操作.java
450.删除二叉搜索树中的节点.java
297.二叉树的序列化与反序列化.java
遇到任何递归型的问题 ,无非就是"灵魂三问""
这个函数是干什么的
这个函数参数中的变量是什么
得到函数的递归结果,你应该干什么
236.二叉树的最近公共祖先.java
496.下一个更大元素-i.java
739.每日温度.java
通过经典问题来阐明一些常用的算法技巧,比如前缀和技巧,回溯思想,暴力穷举技巧
回溯模板
result = [] def backtrack(路径,选择列表): if 满足结束条件: result.add(路径) return for 选择 in 选择列表 : 做选择 backtrack(路径,选择列表): 撤销选择
78.子集.java // 力扣题解
77.组合.java // 力扣题解
46.全排列.java // 力扣题解
37.解数独.java
22.括号生成.java // 力扣题解
// 求二进制数中1的个数
队列中取最大值操作问题
学习最笨的办法就是看书拉,也是最聪明的办法 , 博览群书总会有不一样的收获。
数据结构与算法分析:C语言描述_原书第2版_高清版
算法图解.PDF
数据结构 C++ .3rd_edn. 邓俊辉
算法4
算法新解
我的第一本算法书
labuladong的算法小抄官方完整版.pdf
阿里P8霜神的letCode刷题手册
剑指OFFER 名企面试官精讲典型编程题 第2版
算法设计 经典算法教材 豆瓣9.4评分
200349 算法笔记.胡凡
漫画算法 小灰的算法之旅
2021最新版数据结构与算法面试题手册 1
程序员代码面试指南 IT名企算法与数据结构题目最优解
程序员面试金典第六版pdf
对白的数据结构与算法笔记
对白的LeetCode笔记
西法的刷题秘籍-2021-04-20