现状问题
从2018年开始学习算法,或者可以溯源更早。
现在拾起来有遗忘,遇到为题还是思路没有。
知道了解但不透彻,不能举一反三
现在是2020年了,以现在视角分析2年前未达成目标原因
原因分析
1、编程是一门实践学科,了解概念,还是要动手编写代码
2、没有为自己分阶段制定可落地目标,导致道阻且长,迷茫放弃
3、小目标达成,没有及时给自己进行激励措施
4、没有找到乐趣的切入点,学习还是痛苦的,玩起来会好很多
5、算法是在特定场景下,寻找最优解的套路,学习没有还原应用场景
6、学习概念,但没有刷题
解决方案
1、学习方式:简书+github
2、刷题方式:剑指offer + leecode
3、回顾模式:coding算法范例
4、分阶段设定目标,找到兴趣切入点
5、找出应用场景
6、在本文打卡坚持
意义
算法意义在于在时间和空间中找出最优解
学习算法是掌握一种解决问题的思路和思想
给出一个解法,有没有更好方案
正确的打开思路:
不断追求优化问题,追求O(n),O(nlogn)
打卡
3月23日反思
1、算法面试,考察合理思考路径
一起解决探讨一个问题解决方案的过程,正确只是相对的,算法使用具体环境
2、不要轻视基础算法和数据结构
3、根据所针对问题对象和情景,找出与之合理匹配学习方法和适用难度
4、做题OJ(online judge)工具 leecode(偏大公司面试),HackRanker(技能树专项练习)
5、学习和实践做题之间,掌握平衡。不在于刷题,而是掌握思想
6、解决算法面试整体思路
1、注意给定限制条件和暗示
时间维度、空间维度、数据规模
2、没有思路的另一种解决方式
测试用例、暴力解法
3、优化算法
算法思路,数据结构,
空间和时间交换
对数据进行预处理(排序)
瓶颈处寻找答案,本质还是数学推导
4、实际编写
极端条件判断,代码规范,模块化,复用性
3月23日下午
O表示算法执行的最低上界
时间复杂度
注意要素
1、数据规模
2、多个数据要增加假设变量
3、算法复杂度,参考平均情况
4、编写代码,考虑复杂度震荡
空间复杂度
辅助开辟空间
均摊复杂度分析
排序算法默认复杂度 O(nlogn)
3月24日
如何写出正确程序
1、明确变量的含义
2、循环不变量 ,关注边界情况,最好在 [left...right] 闭区间
3、小数据量调试
4、大数据量测试
3月24日下午
算法题要分析给出限定条件边界
在沟通中,当前场景会给出最优解条件约束
原数组的性质-有序
最直接思考:暴力解法
对撞指针思路
字符串处理
1、空字符串如何看
2、字符定义,数字和字母
3、大小写问题
4、y是否算元音
双索引技术
滑动窗口
子数组
不一定连续的
如果没有解如何处理
多个解如何处理
3月25日
算法理解要采用图形化思维,如果依靠死记硬背,
边界条件变换的时候,代码就是错的
先框定边界条件,询问问题边界
滑动窗口
对撞指针
字符集范围, 英文字母小写
返回解的顺序,任意
没有解,
多个解
是否包含字符串
3月26日
双索引:
指针对撞
滑动窗口
查找表
数组
查找问题
查找有无 set
查找对应 map
常见操作
insert
find
delete
change
二分搜索树
哈希表 失去数据顺序性
map和set平衡二叉树
链表 不支持顺序访问
确定操作节点问题
链表改变next指针方向
Reverse Linked List
指针
pre cur next
虚拟头结点
dummyNode

链表是穿针引线
归并排序
链表双指针技术
边界处理
删除元素 必须有虚拟节点
dummyHead


链表 穿针引线
O(nlogn)不适用
归并排序法
链表 可以改变值
双指针
算法学习方式:图示法
任何操作形象成图像,最容易理解
栈stack
递归
二叉树 前中后序遍历
队列queue
图 广度优先遍历
数 层序遍历
问题复杂要转换成图
递归
重点
二叉树与递归 遍历写法
递归终止条件,递归的过程
递归算法
回溯法 -- 树形问题
排序问题
组合问题
回溯法减枝
二维数组
n皇后问题
n-Queens
快速判断不合法情况
快速剪枝
n为4代表穷尽
采用归纳法
用最小模型验证算法
递归是 自上而下解决问题
动态规划 自下而上思考问题
先解决小数据量问题
动态规划定义
将原问题拆解成若干子问题,同时保存子问题的答案,使得每个子问题只求解一次,最终获得原问题答案
动态规划本质是递归问题。
递归问题->重叠子问题
1、记忆化搜索->自顶向下->减枝
2、动态规划->自底向上

网友评论