![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
文章平均质量分 55
白速龙王的回眸
一命二运三风水
四积功德五读书
六名七相八敬神
九交贵人十养生
展开
-
详解红黑树之插入操作
逻辑:1.插入节点必为红(黑就会打破每一条路径黑节点个数相同的规定)2.若无root,直接变成root,颜色变黑3.通过BST遍历找到插入节点的father4.进入while循环(将当前插入节点的grandfather以下节点群视为一个整体)5.若father是黑,直接结束,满足要求6.若father是红,两个红连在一起,进一步判断uncle7.若uncle为黑或null,首先将LR或RL转成LL或RR,再对LL或RR进行旋转得到平衡,并染色8.若uncle是红,直接对uncle fat..原创 2021-12-07 14:20:06 · 383 阅读 · 0 评论 -
详解红黑树之左旋右旋
为什么要左旋右旋?为了使得左右子树的高度差在一定范围内,需要通过旋转调整,这样就可以保持平稳的搜索效率左旋:步骤1.设原来E的父节点是father,那么左旋之后需要改变的是:2.S和father的关系(若无father则不需要)3.S和E的关系4.E和between E and S的关系实现代码:void tree::L_rotate(node *p){ node* father = p->p_parent; node* pr = p->p_Rchild;原创 2021-12-07 11:56:15 · 881 阅读 · 0 评论 -
树状数组——快速定位中位数
序:对于一个乱序的数组,我们搜寻它的中位数的常规方法就是排序。然而,在时间限制的情况下,排序显然不能满足我们的要求,因此我们这里引进树状数组。几个套路1.lowbit函数用来搜寻一个数x的最低位1的位置,例如x=3时,转为二进制,lowbit(11)=1;又如x=6时,转为二进制lowbit(110)= 10;代码很简单:#define lowbit(i) (i & (-i))我们这里直接建立一个宏,快速计算,至于为什么是(i & (-i)),相信大家想想就知道了(虽然我也有点原创 2021-06-03 17:49:18 · 655 阅读 · 1 评论 -
两种dfs写法的比较
序:近来,做pat发现了两种dfs的写法有些微区别。一种是定长path,用覆盖法深搜;另一种是不定长path,用push_back和pop_back进行回溯。见下面两个函数:1.定常pathvoid dfs(int nodeid, int nodesum, int totalsum){ //先判断后深搜 if(totalsum > target) return; else if(totalsum == target) { //若非叶子原创 2021-05-13 18:56:24 · 384 阅读 · 0 评论 -
01背包问题简易讲解
序:01背包问题是一类经典的动态规划问题,每一个物品可以选或者不选。通过动态规划,可以使得前i件物品的选择仅与前i-1件的物品选择有关,是不是有点像马尔可夫链?题目概述:有n件物品,每件物品的重量为w[i],价值为c[i]。现有一个容量为V的背包,问如何将物品放入背包,使得背包内物品的总价值最大。其中每件物品只有1件。分析:如果每件物品均判断在或不在,则会导致2^n的复杂度,这是令人崩溃的。因此我们另寻僻径。令dp[i][v]表示前i件物品(1 <= i <= n, 0 <=原创 2021-03-27 11:28:51 · 213 阅读 · 0 评论