为期60天的代码随想录算法训练营结束了,中间想放弃过,敷衍过,但是最终还是完成了,给我自己和打满60天卡的小伙伴们一个赞。这60天的从一个算法小白到刚刚入门,虽然只是小小一步,却并不容易,至少我现在看到题目会思考用什么办法解决了,有时候还会想到好几种办法,我的进步是肉眼可见的,也感谢代码随想录,感谢卡尔哥,这网站太好了!代码随想录,大家走过路过不要错过。下面是我的总结
目录
数组类题目
链表类题目
哈希表类题目
字符串类题目
栈与队列
二叉树类题目
回溯算法
贪心算法
动态规划
数组类题目
二分查找:查找一个元素,操作3个指针
- 前提:有序且无重复元素
移除元素:快慢指针,快指针找不含目标元素的数组,慢指针更新数组下标位置
滑动窗口:不断调节子序列的起始位置和终止位置,从而得到结果
对于数组类题目,要想到双指针法,但是要思考指针的位置,记得二分查找要排序
链表类题目
链表的题目一般比较难想,画图可以帮助我理清思路,对于链表的修改(插入、删除、移动),都加一个虚拟头节点
哈希表类题目
对于Java来说,哈希表主要有HashMap 和HashSet 和数组
当我们遇到了要快速判断一个元素是否出现在集合里时,就用哈希法
数组:大小有限,数据不能太分散
- 可解决的题目类型:242.有效的字母异位词
map<Key,Value>:key是唯一的且是无序的
- 可解决的题目类型:1. 两数之和
set<Key>:
- 可解决的题目类型:349. 两个数组的交集
字符串类题目
字符串类题目可以参考数组类题目,一般也是双指针法
字符串类题目还有KMP算法,可以看一下我这篇博客KMP算法总结
栈与队列
栈:先进后出 队列:先进后出
要记住栈与队列的常用API,括号匹配就是用栈道一道经典题目
还有单调栈,单调队列,多多练习才能熟练操作栈与队列
二叉树类题目
二叉树多用递归来解题,这就不得不记住递归三部曲:
- 确定递归函数的参数和返回值
- 确定结束条件
- 单层递归逻辑
要掌握二叉树的前中后序遍历和层序遍历的递归法和迭代法,可以看一下我这篇博客二叉树的遍历
递归的本质就是栈,二叉树的迭代法大多数都是用栈实现的
回溯算法
我觉得回溯算法很难,都是照着题解抄,多亏了卡哥总结的回溯算法的模板,只要照着模板,简单的都能自己写出来:
void trabacking(){if(终止条件){存放结果;return;}for(遍历){处理节点;trabacking();撤销;} }
回溯法能解决的问题:
- 组合问题
- 排列问题
- 分割问题
- 子集问题
- 棋盘问题
贪心算法
贪心的本质就是局部最优-->全局最优,不用关心上一个状态
这是一种思想
动态规划
动态规划中的每一个状态是由上一个状态推导出来的
动规五部曲
- 确定dp数组的下标及其含义
- 确定递推公式
- dp数组的初始化
- 确定遍历顺序
- 举例推导dp数组