不涉及到具体的问题和实际应用,只是对每种问题的名词有一定的了解,来弥补自己的一些认知层面的欠缺,能够在之后的学习中做到不被牵着鼻子走,问到某个小问题的时候,说不定能恍然大悟:“噢,这个东西我记得,后面有涉及到,这个问题我虽然不知道官方解法,但我有自己的一些思考和思路来解决”。
动态规划
动态规划是将大的问题分解成互相重叠的子问题(这里的互相重叠有一丝丝的不明白,不过现在的不明白的印象也利于之后的学习,之后对这方面的印象会更加深刻),通过反复求解子问题来解决原问题就是动态规划,如果某一问题有很多重叠子问题,使用动态规划来解是比较有效的。
求解动态规划的核心问题是穷举,但是这类问题穷举有点特别,因为这类问题存在「重叠子问题」,如果暴力穷举的话效率会极其低下。动态规划问题一定会具备「最优子结构」,才能通过子问题的最值得到原问题的最值。另外,虽然动态规划的核心思想就是穷举求最值,但是问题可以千变万化,穷举所有可行解其实并不是一件容易的事,只有列出正确的「状态转移方程」才能正确地穷举。重叠子问题、最优子结构、状态转移方程就是动态规划三要素。
贪心
顾名思义,在求解问题的时候,总是需要做出在当前来看最好的选择,期望通过每个阶段的局部最优解来达到全局最优解,但是得出的结果也并不是最优解。
适用场景:问题能够分解成子问题来解决,子问题的最优解能递推到最终问题的最优解,就能用贪心算法的到最后的最优解,这种子问题最优解称为最优子结构。
贪心算法与动态规划的不同点在于它对每个子问题的解决方案都做出当前的最优选择,不能回退,而动态规划会保留之前的运算结果,并根据之前的结果进行选择,有回退的功能,贪心是动态规划的理想化的情况。
二分查找
教程里对这个问题没有定义,那我就聊一聊我对二分查找的一个看法吧,顺序一定是二分查找的前提,可以做到找到增删改查数据,通过不断的选取中点,直到获取到想要的那个数据,二分查找需要关注的是左右端点的开闭。
深度优先和广度优先
不过多赘述
双指针
也算是一种非常好用的办法了,循环的时候选取双指针,普通指针:两个指针向着同一方向或者不同方向;对撞指针:顾名思义;快慢指针:顾名思义。
滑动窗口
位运算
程序中所有的数载计算机内存中都是以二进制存储的,位运算就是直接对整数在内存中的二进制进行操作,由于直接在内存中进行操作,不需要转成十进制,因此处理速度非常快。
递归&分治
递归三要素:1.递归函数和参数;2.递归终止条件;3.递归单层搜索逻辑。
分治:分治会将大问题拆解成小问题,拆解到最小问题之后,开始不断合并结果,递归是分治实现的一种形式或者是分治实现的一部分,分治包括三分部分,分解、计算、合并。分治的场景很多,例如快速排序,归并排序。
剪枝&回溯
剪枝:排除那些不符合条件的分支,提高程序的运行效率。
回溯:一层层递归,尝试搜索答案。
堆
满二叉树:除叶子节点外,所有的节点都有两个子节点,这类二叉树称作满二叉树(Full Binarry Tree)。
完全二叉树:若设二叉树的高度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层从右向左连续缺若干结点,这就是完全二叉树。
单调栈
排序算法
这算是最为熟悉的一方面了。冒泡排序,选择排序,插入排序,希尔排序,归并排序,快速排序,堆排序,计数排序,桶排序,基数排序。
链表
set&map
栈
队列
数组
字符串
树
树这种数据结构包括根节点root,左右节点,子树中又有父节点,子节点,兄弟节点,没有子节点的成为叶子节点,树分为二叉树和多叉树
字典树
Trie树,即字典树,又称前缀树,是一种树形结构,典型应用是用于统计和排序大量的字符串(但不限于字符串),所以经常被搜索引擎用于文本词频统计。它的优先是,最大限度的减少无谓的字符串比较,提高查找效率。
Trie的核心思想是空间换时间,利用字符串的公共前缀来降低查询时间的开销,以达到提高效率的目的。
并查集
用于处理一些元素的合并和查询问题。