代码随想录训练营一刷总结

代码随想录训练营一刷总结

一、数组

四类经典题目:二分法、双指针法、滑动窗口、模拟行为。

二、链表

经典题目:虚拟头结点、链表的基本操作、反转链表、删除倒数第N个节点、链表相交、环形链表。

三、哈希表

希表都是用来快速判断一个元素是否出现集合里。
经典题目:数组作为哈希表、set作为哈希表、map作为哈希表
有明确数量限制的使用数组;要记录的不光是数本身类似于键值对使用map;没有数量限制只记录数本身用set。

四、字符串

题目类型:双指针法、翻转系列、KMP

五、双指针法

在数组,链表,字符串、N数之和的题目中都用到了双指针法。

六、栈与队列

栈经典题目:栈在系统中的应用、括号匹配问题、字符串去重问题、逆波兰表达式问题
队列的经典题目:滑动窗口最大值问题、求前 K 个高频元素

七、二叉树

递归三部曲: 确定返回值参数、确定终止条件、确定单层逻辑。
二叉树的遍历方式: 深度优先(前、中、后序遍历),广度优先(层序遍历)
经典题目:
求二叉树的属性(是否对称、求最大深度、求最小深度、求有多少个节点、是否平衡、找到所有路径、递归中如何隐藏着回溯、求左叶子之和、求左下角的值、求路径总和)
二叉树的修改与构造(翻转二叉树、构造二叉树、构造最大的二叉树、合并两个二叉树)
求二叉搜索树的属性(二叉搜索树中的搜索、是不是二叉搜索树、求二叉搜索树的最小绝对差、求二叉搜索树的众数、二叉搜索树转成累加树)
二叉树公共祖先问题(二叉树的公共祖先问题、二叉搜索树的公共祖先问题)
二叉搜索树的修改与构造(二叉搜索树中的插入操作、二叉搜索树中的删除操作、修剪二叉搜索树、构造二叉搜索树)
遍历顺序:
涉及到二叉树的构造,无论普通二叉树还是二叉搜索树一定前序,都是先构造中节点。

求普通二叉树的属性,一般是后序,一般要通过递归函数的返回值做计算。

求二叉搜索树的属性,一定是中序了,要不白瞎了有序性了。

八、回溯算法

回溯使用递归控制for循环的数量
回溯算法的模板:

void backtracking(参数) {
    if (终止条件) {
        存放结果;
        return;
    }

    for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
        处理节点;
        backtracking(路径,选择列表); // 递归
        回溯,撤销处理结果
    }
}

回溯能解决的问题:
组合问题:N个数里面按一定规则找出k个数的集合
排列问题:N个数按一定规则全排列,有几种排列方式
切割问题:一个字符串按一定规则有几种切割方式
子集问题:一个N个数的集合里有多少符合条件的子集
棋盘问题:N皇后,解数独等等
去重:树枝去重、树层去重

九、贪心算法

做是做完了,但是不是很有感觉

十、动态规划

动规五部曲分别为:

  1. 确定dp数组(dp table)以及下标的含义。
  2. 确定递推公式。
  3. dp数组如何初始化。
  4. 确定遍历顺序。
  5. 举例推导dp数组。

经典题目: 背包问题、打家劫舍、股票问题、子序列问题

背包递推公式
问能否能装满背包(或者最多装多少):dp[j] = max(dp[j], dp[j - nums[me]] + nums[me]);
问装满背包有几种方法: dp[j] += dp[j - nums[i]]
问背包装满最大价值: dp[j] = max(dp[j], dp[j - weight[me]] + value[me]);
问装满背包所有物品的最小个数: dp[j] = min(dp[j - coins[me]] + 1, dp[j]);

遍历顺序
01背包
二维数组的01背包,先遍历物品还是先遍历背包都是可以的,且第二层for循环是从小到大遍历。
一维dp数组的01背包,只能先遍历物品再遍历背包容量,且第二层for循环是从大到小遍历。

完全背包

一维dp数组的完全背包,先遍历物品还是先遍历背包都是可以的,且第二层for循环是从小到大遍历。

如果求组合数就是外层for循环遍历物品,内层for遍历背包。

如果求排列数就是外层for遍历背包,内层for循环遍历物品。

如果求最小数,那么两层for循环的先后顺序就无所谓了

打家劫舍(间隔k个、首尾相连、树型)
股票问题(买卖1次,买卖2次,买卖k次,不限次数,间隔一天)
子序列问题(连续、不连续、出现次数、最长相等,等等)

十一、单调栈

使用单调栈的时机:
通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了。时间复杂度为O(n)。
找左右比自己大的元素位置,栈顶到栈底,单调递增。
找左右比自己小的元素位置,栈顶到栈底,单调递减。

十二、结束语

感谢卡哥的训练营,没有每日打卡的氛围我也坚持不下来。我最早接触代码随想录是去年冬天,那时刚起步懵懵懂懂刷了十多道题就坚持不下去了,感觉没有方向,还感觉都刷完篇幅很长,到了今年6月份,技术学的差不多了,也是时候开始刷题了,于是叫上兄弟一块加入训练营开始了我的刷题之旅,做了一两周就超过了我之前的进度,让人倍感兴奋。后面二叉树、回溯、背包按照三部曲、五部曲做起来非常有感觉,尤其是回溯和背包感觉直接拿下了。当然除了这些之外还是有很多不太会的题目,以及遗忘的内容,所以按周总结、定时复习很重要,否则事倍功半,接下来开始二刷,有一个重要的任务就是每一块知识形成一个知识导图,然后把它们串联起来组成一个大网,勤加记忆沉淀成自己的东西。

你可能感兴趣的:(算法)