algo
鸡汤篇
创作不易,感觉有帮助到你,可以顺手star
用产品思维帮助更多的人学习算法 更多的为用户考虑而写的一个仓库
用老罗的话 彪悍的人生不需要解释 挑一点恶心的干干 先开始写算法,像打造产品一样写一个算法仓库, 帮助更多的人学习算法,同样也是自我学习的过程
Java写的算法仓库 算法最重要的是心得
准备做一个长期的算法仓库 ,像阿甘一样做个傻子,不停奔跑,每天学习一个算法,复利思维
日拱一卒,功不唐捐
把人生比作公司或者游戏的话 , 我准备长期做的事情,一个是跑步锻炼身体,一个阅读书籍(技术类,非技术类书籍),一个就是这个算法仓库了
纸上得来终觉浅 ,绝知此事要躬行
三部曲: 模仿,学习, 超越
高筑墙 , 广积粮 , 缓称王
天道酬勤,勤能补拙。博观而约取,厚积而薄发
算法: 先把一个大问题拆解成一个个小问题 , 再解决小问题 , 小问题解决了拼接起来解决大问题
磨刀不误砍柴工, 磨石不误磨刀工
坚持下去,会有突然间成长的一天
自顶向下 ,逐步求精
费曼算法: 1.将问题写下来 2. 好好思考 3.将答案写下来
最笨的学习方法 就是把抄袭一遍也是最聪明的办法,遇到晦涩难懂的知识,大脑一下子接受不了,抄袭一遍之后,大脑慢慢接受
排序算法
-
冒泡排序 :BubbleSort
-
插入排序 : InsertSort 思路: 1. 每次碰到元素小的值 就往后面挪动一位 2.insertValue的值插入适当的位置
-
选择排序 SelectSort 1.选择排序每次从未排序区间中最小的元素 2.首先找出数组中最小的哪个元素 ,其次,将它和数组的第一个元素交换位置 以此类推
-
快速排序 1. 递归 2 。 二分 3. 双指针的思路
- 计数排序
-
归并排序 mergeSort 主要思想是递归 2. 主要是两个小的有序的数组合并成一个大的数组
-
希尔排序 : ShellSort 思路 : 先分组 再使用插入排序 ,再缩小间隔d
-
堆排序 :HeapSort 题解: 1. 堆存储结构是个数组 2. 先构建一个大顶堆 3 , 遍历取大顶堆 取最大值 == 牛客题解
二叉树
哈希表
栈和队列
数组
链表
字符串
- 无重复字符的最长子串:LengthOfLongestSubstring 滑动窗口
- 反转字符串
算法套路
双指针
排序
贪心思想
二分查找
搜索
动态规划
斐波那契数列
矩阵路径
数组区间
分割整数
最长递增子序列
最长公共子序列
01背包
股票交易
字符串编辑
接雨水
算法题解
-
三数之和: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缓存机制 // 力扣 牛客
-
合并两个有序数组 // 牛客
剑指offer
剑指offer-数据结构
剑指offer-二叉树
剑指offer-动态规划
剑指offer-查找和排序
剑指offer-回朔法
剑指offer
程序员代码面试指南左程云
第一章栈和队列
第二章链表问题
第三章二叉树问题
第四章递归和动态规划
####递推三部曲
递推三部曲
* 1. 边界条件
* 2. 递推公式
* 3. dp数组取值
* 套路 ; dp[i][j] 往往依赖 dp[i][i-1] dp[i-1][j] dp[i-1][j-1] 只要是动态规划就依赖这三个
回溯
第五章字符串问题
第七章位运算
第八章数组和矩阵问题
算法通关之路
第一章预备知识
第二章数学之美
第三章回文的艺术
发现规律 算法核心 有什么条件 要达到什么目的 例如:回文字符串要求是正读反读结果都是一样的句子 隐含条件 偶数个字符的话 每个字符都是成对出现的 奇数字符的话 只有一个字符是单独一个的 , 其他字符都是成对出现的
第四章游戏之乐
第五章深度优先遍历和广度优先遍历
第六章二分查找
第七章位运算
第八章设计
第九章双指针
第十章动态规划
第十一章滑动窗口
第十二章博弈问题
第十三章股票问题
第十四章分治法
第十五章贪心
第十六章回溯法
回溯法是一种复杂度很高的暴力算法 ,实现简单且有固定模板 。 不同于普通的暴力搜索 ,回溯法会在每一步判断状态是否合法,而不是等到状态全部生成后再进行确认
回溯讲的非常好的题解
第十七章一些有趣的题目
单调栈
单调栈牛客题解
第十八章一些通用解题模板
labuladong的算法小抄
第一章核心套路篇
数据结构的底层存储方式只有两种:数组(顺序存储)和链表(链式存储)。
数据结构是工具 ,算法是通过合适的工具解决特定问题的方法
计算机解决问题其实没有任何特殊技巧,它唯一的解决办法就是穷举
回溯算法框架:解决一个回溯问题,实际上就是一个决策树的遍历过程
- 路径:也就是已经做出的选择
- 选择列表:也就是你当前可以做的选择
- 结束条件:也就是到达决策树底层,无法再做选择的条件
- 写backtrack函数时,需要维护走过的"路径" 和当前可以做的"选择列表",当触发""结束条件"时,将"路劲"加入结果集
第二章动态规划系列
动态规划分为一下几步
*找到"状态"和"选择"
*明确dp数组/函数的定义
- 寻找状态之间的关系
*动态规划的通用技巧:数学归纳思想
- 动态规划最优子结构以及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
特殊数据结构 单调队列
秀操作之K个一组反转链表
第4章算法思维系列
通过经典问题来阐明一些常用的算法技巧,比如前缀和技巧,回溯思想,暴力穷举技巧
回溯算法解决子集,组合,排列
回溯模板
result = []
def backtrack(路径,选择列表):
if 满足结束条件:
result.add(路径)
return
for 选择 in 选择列表 :
做选择
backtrack(路径,选择列表):
撤销选择
TwoSum问题的核心思想
摊煎饼也得有点递归思想
前缀和技巧解决子数组问题
第5章高频面试系列
编程之美 -微软技术面试心得
游戏之乐-游戏中碰到的题目
一摞烙饼的排序
第2章数字之魅-数字中的技巧
// 求二进制数中1的个数
第3章结构之法-字符串及链表的探索
队列中取最大值操作问题
程序员面试金典
数组与字符串
算法图书
学习最笨的办法就是看书拉,也是最聪明的办法 , 博览群书总会有不一样的收获。