![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
基础算法模版
jxzheng95
这个作者很懒,什么都没留下…
展开
-
二叉树中序遍历
搜索二叉树转双向链表思路二叉树中序遍历非递归版本的中序遍历用栈来实现。一个元素出现在栈顶一次,这一次会被处理并出栈。trick:用一个指针去记录当前节点cur,如果cur->left左侧还未遍历,就会将cur入栈并访问cur->left。一行很重要的代码是cur = cur->right,这一句之后如果cur == NULL,则说明栈顶元素的左子树访问完了,应该访问当前...原创 2019-10-15 11:36:17 · 167 阅读 · 0 评论 -
二分查找
应用一个数组,左右两段有不同的性质,寻找分段的节点。方法两种情况,找左半段的右节点和找右半段的左节点。(如下,分别对应higher_bound和lower_bound)。步骤:首先确定check函数确定找的节点如果是左半段的右节点,则是right = mid-1,这样搜索区间向左移动。同时mid=(left+right)/2+1,而left=mid。如果是右半段的左节点,则是 ...原创 2019-08-04 15:43:12 · 122 阅读 · 0 评论 -
快速排序
应用快速排序,适合于可以随机访问的容器(vector, 数组),不适合链表。不稳定排序。最坏情况O(n2)O(n^2)O(n2),取决于pivot的选择。方法划分过程:选择一个pivot,将数组划分为左右两段,左段小于等于pivot,右段大于等于pivot。将划分过程左右两段进行递归。模版两种模版,只是划分过程不同。交换法void quick_sort(vector<int&...原创 2019-08-04 15:55:32 · 132 阅读 · 0 评论 -
前缀和
应用快速求某一范围内的数值的和方法一维前缀和S[i]表示前i个数的和,那么用S[r] - S[l-1] 就可以得到第l个数到第r个数的和(若数组下标从1开始则是[l, r]范围内的数值和)。二维前缀和尽量让矩阵横纵坐标从1开始,可以避免很多边界情况。S[i][j] = S[i-1][j] + S[i][j-1] + arr[i][j] - S[i-1][j-1] 就可以得到以(1,1...原创 2019-08-04 20:02:01 · 133 阅读 · 0 评论 -
差分数组和差分矩阵
应用对某一数组或矩阵进行频繁的范围修改后输出操作结果。方法一维差分数组从原数组得到差分数组b的方法为b[i] = a[i] - a[i-1]。所以差分数组b的前缀和数组是原数组a。我们想要修改数组a的一个范围[l,r]的值加c时,只需要b[l] += c,然后b[r+1] -= c,在对b数组求前缀和复原数组时就可以得到修改后的a。tricks零数组的差分数组依旧是零数组。假设零数组...原创 2019-08-04 20:51:26 · 4991 阅读 · 2 评论 -
单调栈
应用往往用来遍历数组,找到数组中离某个元素最近的比它小或者比它大的值。O(n)的复杂度,一遍扫描。当然也可以用来找一个元素两侧比它大或者比它小的元素长度(用它将要出栈时的当前元素下标i减去它出栈后栈顶元素的下标j再减1)。方法假如找某个元素左边离它最近的比它小的元素,那么我们要用单调递增的栈。从左到右扫描数组,假如当前元素arr[i]比栈顶元素s.top()小,则s.pop(),直到栈为空...原创 2019-08-07 21:38:14 · 138 阅读 · 0 评论