【基础算法总结】字符串篇 字符串 string 是一种数据结构,它一般和其他的算法结合在一起操作,比如和模拟,高精度加减,双指针,动态规划等算法结合,所以有关字符串类的题型是多种多样的。通过本篇文章挑选的一些题目来熟悉有关字符串接口的使用。字符串类型的算法题型是多种多样的,并且也可以使用多种字符串函数接口了解决问题。
【基础算法总结】链表篇 有关链表的算法题也是一类常见并且经典的题型,这些题要使用数据结构中我们手搓的链表结构,也要使用STL中的 list 容器。下面是几点常用操作的总结(1)善于画图。(2)引入虚拟头结点。方便处理边界情况,就是当没节点第一次头插或尾插的时候的那个判断,引入虚拟头结点就可以避免这个判断(写成 ptail = newHead)。(3) 不要吝啬空间,大胆定义变量。(4)快慢双指针的使用。主要应用是判环,找链表中环的入口,找链表中倒数第 n 个节点。(5)
【基础算法总结】分治--快排+归并 分治是一类十分重要的算法,"分治"顾名思义就是分而治之,把一个大问题分成若干个相同或是相似的子问题 ,再把这些小问题继续划分成若干个相同或是相似的更小子问题…直到最小子问题不可再划分。接着通过解决最小子问题进而解决了上一层更小子问题…又进而解决了大问题。这个过程就是 – 递归。我们学过的快速排序和归并排序就是非常典型也是非常重要的分治。但是它们的分治思想不仅仅用于排序上,在解决其他问题时也是非常有效的。下面介绍的若干道题目就是使用快排和归并的核心思想解决的,让大家加深对它们的理解。
【基础算法总结】模拟篇 模拟算法本质就是"依葫芦画瓢",就是在题目中已经告诉了我们该如何操作,我们只要把题目中的过程转化成代码即可。特点是思路简单,难点是十分考验代码功底。解决有关模拟类的题型,最重要的就是根据题目写代码。有些模拟题可能正面做困难,进行优化时一般都是"找规律"进行转换。
【基础算法总结】位运算 1. 基础位运算符注意:参与位运算的对象只能是整型数据(int, unsigned, char),不能为实型。上面六种基础位运算是本篇文章重点涉及的,要想详细了解它们的含义和运算规律,请点击文章【移位操作符,位操作符运算规则详解】2. 位运算符的优先级只要记住一句话:表格不用死记,能加括号就加括号。3. 给定一个数 n ,判断他的二进制表示的第 x 位是 0 还是 1?4. 将一个数 n 的二进制表示的第 x 位修改成 15. 将一个数 n 的二进制表示的第 x 位修改成 06. 位图思想。
【基础算法总结】前缀和 前缀和也是基础算法之一,它一般应用于快速求出某个连续区间的和/积。前缀和一般包括一维前缀和,二维前缀和,其实它的做题流程有一点点像动态规划的感觉。前缀和算法的时间复杂度是O(1)。前缀和与二分查找类似,也是有固定模板的,下面的前两题分别就是一维/二维的前缀和模板题。通过上面若干道题目要掌握使用前缀和的两个步骤:一是预处理前缀和数组,这里要先明确 dp[i][j] 的含义,再推导递推公式,二是使用前缀和数组,其实就是在预处理好的 dp 数组中直接拿值,这一步的时间复杂度是O(1)。
【基础算法总结】二分查找 二分查找算法是一种十分经典,十分基础的算法。细节最多,最容易写出死循环,但是真正掌握之后,又是最简单的算法。相信大家在之前一定听过"二分查找只用于数组有序的情况下这种说法,其实这是不准确的!!!它的本质是:数据具有二段性。应用场景准确的说是:当数组里的一个数和目标数比较之后,划分出了两段区域(此时具有"二段性"),通过某种规律可以直接舍弃一段区域,在另一段区域查找,周而复始这个操作,直到找到目标数。本篇文章将通过若干道题目进行验证。
【基础算法总结】滑动窗口 滑动窗口算法也是基础算法之一,它的本质是一对"同向双指针"。当我们分析的对象是⼀段连续的区间(子数组/子串),使用暴力解法发现两个指针可以不回退的一直往前走,并且可以利用单调性解决问题时,就可以使用滑动窗口。时间复杂度是O(N)如何使用滑动窗口呢?(1)初始化 left = 0, right = 0。用 left 和 right 来控制这个"窗口"(2)进"窗口"(3)判断,是否要出"窗口",循环(2)(3)步。(4)更新结果。
【基础算法总结】双指针 双指针算法是基础算法之一,一般用于涉及数组分块/数组划分这类问题。这里的"指针"是利用数组下标或是一个数来充当的。在遍历过程中,两个指针的位置:cur:从左往右扫描数组,遍历数组。dest:指向已处理的区间内,非0元素的最后一个位置。如下图所以两个指针把数组分成了三个区间双指针算法是一种基础,但是十分经典的算法。通过上面的若干道题可知,"双指针"使用起来是十分灵活的,有时代指数组下标,有时也可以代指一个数。使用双指针算法的关键之一就是要控制好边界,稍不留神就会出现数组越界的问题并且在使用这个算法时。
【基础算法总结】BFS_拓扑排序问题 入度:针对一个点,有多少条边指向它。出度:针对一个点,有多少条边从这个点出去。如上图:1顶点的入度是0,出度是2。2顶点的入度是2,出度是1。3顶点的入度是1,出度是2…使用拓扑排序的算法解决问题时,首先我认为最重要的一点是能否把题干转换成有向无环图。二维数组和哈希表。但是并不是只能用这两个,而是要根据题目灵活的选取嵌套。建完图后就是拓扑排序的主体,首先把入度为0的顶点入队列,再使用bfs删除取出顶点的那些边,在把它指向的顶点入度-1。最后判断结果的时候要么问是否存在拓扑排序要么就是返回拓扑序列。
【基础算法总结】BFS_多源最短路问题 所谓多源,就是有多个起点。对应上一篇文章【BFS_最短路问题】的单源问题。这篇文章介绍用bfs解决边权为1(或边权相等)的多源最短路问题。我们解决单源问题时,是先把起点入队列,再一层一层向外扩展。而多源问题是把所有源点当成一个"超级源点",把"超级源点"加入到队列,再一层一层向外扩展,就变成单源问题了。如何把所有源点当成"超级源点"?通过介绍下面的四道题目将给出答案。其实本篇文章的多源最短路和上一篇文章的单源最短路的思想基本上是一模一样的。
【基础算法总结】BFS_最短路问题 bfs算法是解决最短路问题的经典方法。我感觉解决最短路问题核心的关键是每一次出队列时都要把上一次入队列的数据全部出完(就要写for循环),而最短路程就是向外扩展的层数。
【基础算法总结】BFS_FloodFill算法 FloodFill(洪水灌溉) 算法介绍假设一个 4 * 4 的方格代表一块土地,土地上有些地方是凹陷的(假设用负数表示,-1,-2,-3……大小表示凹陷程度),有些地方是凸起的(假设用正数表示,1,2,3,4……大小表示凸起程度)。此时如果发洪水或是下雨,就会把凹陷的地方填满水,凸起的部分就会把凹陷的部分包围,填满水的区域会被连成一片一片的。所以这类问题要么是问有多少块填平的区域,要么是问最大的区域面积是多少,要么是问某一块区域的边长是多少。有些问题是规定只能上下左右联通,有些是斜对角也能联通。