算法Journey
文章平均质量分 93
分享常见的算法知识以及例题共同进步
9ilk
爱码人士
展开
-
【位运算】--- 进阶题目赏析
由图中我们可以知道,ret最后一定是两个只出现一次的数字(记为a和b)的异或,由于异或是相同为0,相异为1,因此我们可以利用n&(-n)提取异或后的ret最右边的1,也就是a和b在这个bit位上的数字不同,依照这个不同可以将原数组中的数字划分为两种:一种是k位上是1,一种是k位上是0,由于其他数字出现了两次他们异或之后得到的一定是0,最后ret1和ret0得到的一定是只出现一次的两个数字。异或一遍原来数字再异或一遍nums,就可以得到消失两个数字的异或。本节我们来赏析位运算的一些进阶题目。原创 2024-09-03 13:39:40 · 1091 阅读 · 30 评论 -
【位运算】--- 初阶题目赏析
那是因为如果两个数某个位上的数字都是1话,就需要进位,此时按位与得到的还是1,而如果两个数中有一位是0的话按位与就是0,因此通过按位与能很好的知道那一位进位,那一位不进位。我们知道异或其中两条运算律是a^a=0和结合率,因此我们遍历一遍原来的数字,再遍历一遍缺失数组,最后得到的数就是缺失的数字,因为未缺失的在两次过程相当于出现两次,也就是会异或为0,最后只剩缺失的没有配对.利用哈希表对小写字母进行映射,如果遍历过程中出现已经映射的直接返回false,若遍历完之后都没有出现映射两次的则返回true。原创 2024-09-02 22:59:31 · 1000 阅读 · 31 评论 -
【前缀和算法】--- 进阶题目赏析
以K=4为例子,求出某个前缀和为-1,-1%K应该为3,但有的编程语言-1%K = -1(不同编程语言对商的取整是不同的,有的向0取整,有的向负无穷取整).这里的-1应该要加上K,转正成3.这是因为-1和3分别模4结果看似不相等,但是3-(-1) = 4,4%4 == 0,所以前缀和-1和3其实是等价的,只是不同语言对%运算的处理不同。这道题与"和为K的子数组"其实是类似的,我们以i位置为结尾的子数组观察,如果能找到一段右边部分能被k整除,此时问题转化成。我们哈希表此时存的不是前缀和,原创 2024-09-01 15:54:04 · 1045 阅读 · 26 评论 -
【二叉树进阶】--- 前中后序遍历非递归
当我们还面临一个问题当取到左路结点的右子树时,我们需要想办法标记判断右子树是否已经访问过了,如果访问过就直接访问根,没有访问过就访问右子树。中序是对左路结点时不能先访问,而是先依次入栈,入栈完左路结点后再访问这些左路结点,再依次访问他们各自的右子树。后序跟前序的思路也是完全一致,毕竟模拟的是递归展开过程,只不过后序是左子树-右子树-根,最后再访问根结点,也就是说要左右子树都访问完之后才能访问根并出栈。3.如果左路节点右子树不为空,右子树已经访问过,那么上一个访问节点应该是右子树的根,原创 2024-08-30 17:21:25 · 1288 阅读 · 19 评论 -
【二叉树进阶】--- 二叉搜索树转双向链表 && 最近公共祖先
不同的是,我们需要记录前驱节点prev,ptail->next = node,此时的node就是我们中序遍历的当前访问节点,此时ptail需要更新成node(当前访问节点),prev就是上一个按中序被访问节点,所以我们需要在更新ptail之前记录prev,同时更新好前驱和后继指针的指向。归根结底,找公共祖先也就是找公共节点,如果我们能求出两个节点的祖先路径,就能转化为链表相交问题了。题目要求链表中的节点是排好序的,因此结合二叉搜索树的性质(二叉搜索树中序遍历出来是有序的),我们可以。原创 2024-08-14 21:25:09 · 1808 阅读 · 23 评论 -
【二叉树进阶】--- 根据二叉树创建字符串
假设有颗满二叉树,当根结点入队时顺便此时他的左右结点也顺便入队,此时队列中结点的个数就是2,此时这两个结点对应层数就是2;类似地当第二层的两结点一父带两娃时,此时入队了4个结点,这一层也是有4个结点。1.了解思路一后,我们发现思路一维护每个结点的层数比较麻烦,我们能否另寻他路,一口气把每层的结点push进数组里?4.为了效率,我们可以先计算总的高度,提前开好二维数组所需要的层数;.我们按上面流程得到的是从上到下的层序遍历,从下往上我们可以使用。的思想(即一个父亲入队的时候,它的两个孩子也一起入队)实现。原创 2024-08-14 21:25:01 · 1495 阅读 · 14 评论 -
【前缀和】--- 初阶题目赏析
f[i]表示前缀和数组,即【0,i-1】区间数组的和,由此可得f[i] = f[i-1] + nums[i-1];g[i]表示后缀和数组,即【i+1,n-1】区间数组的和,由此可以得到g[i] = g[i+1] + nums[i+1].获取dp前缀和数组,dp[i]用来表示[1,i]区间内数组值之和,由于中心下标是左边区间元素之和 == 右边元素之和,中心坐标不包括在那,所以我们可以先获取前缀和数组,遍历数组,当dp[i-1](左边区间) == dp[n] - dp[i](右边区间),返回中心坐标.原创 2024-08-30 10:54:28 · 953 阅读 · 24 评论 -
【前缀和算法】--- 一维和二维前缀和模板
任取一块区域,假设D为(i,j)点,若我们要求dp[i][j]也就是求(1,1)到(i,j)区域的和,我们可以将这四部分相加,由于B和C不好求,我们可以利用A(dp[i-1][j-1])来间接求这两部分,但是不要忘记减去多进来的A。我们前缀和数组下标是从1开始的,如果下标从0开始,当求[0,2]区间的值之和时就转化成dp[2] - dp[-1]这个dp[-1]是个边界情况需要我们特殊处理且。我们发现,比如dp[3]是【1,3】区间值的和,那么就相当于是【1,2】区间的和+arr[3].2.使用前缀和数组。原创 2024-08-20 21:43:43 · 1145 阅读 · 32 评论 -
【二分查找】--- 进阶题目赏析
二分过程:参考代码:🏠 寻找旋转排序数组中的最小值📌 题目内容二分流程:参考代码:思考:我们划分两端区间是以D为参考点,那么我们是否能以A为参考点呢?🏠 0~n-1中缺失的数字📒 思路二:直接遍历找结果📒 思路三:位运算📒 思路四:高斯求和公式📒 思路五:二分查找前面的思路都很简单,但时间复杂度都是O(N)。仔细观察我们发现因为缺失了数字,会造成二段性。参考代码:原创 2024-08-19 22:09:49 · 1561 阅读 · 26 评论 -
【二分查找】--- 初阶题目赏析
数组为一个升序数组。与经典的二分查找不同的是,如果找不到目标值啧应该返回它应该在数组中被插入的位置。参考代码:🏠 x的平方根📌 题目内容📌 题目解析 对于平方根不是整数的相当于是向下取整本题数据范围为 0 <= x <= 2^31 -1,用int可能会溢出,因为会有平方的操作。参考代码:原创 2024-08-17 21:35:47 · 1650 阅读 · 16 评论 -
【二分查找】--- 二分模板总结
/也可以是left+(right-left+1)/2;注:...表示具体问题具体分析。查找左边界总结:本博客我们讲解了朴素二分模板以及边界二分模板,朴素二分模板应用比较局限,而对于边界二分模板我们更常用.对于边界二分模板,我们要处理好它的循环条件以及求中点,同时根据我们求的左端点还是右端点来更新left和right.原创 2024-08-16 13:21:24 · 1390 阅读 · 27 评论 -
字符串匹配 --- BF算法 && KMP算法
对于此时不匹配我们能提取到的一个信息是你其实知道前面六个字符是"ABCDAB",因此我们可以利用这个信息找到最大程度能匹配子串的一部分,此时就是最好的情况这便是KMP算法的核心 --- 利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。与BF算法不同的是,当匹配失败时,主串时不回退的,子串回退到相应位置。问题是KMP算法中,当匹配失败时,子串怎么知道该回退到哪个位置?原创 2024-06-26 20:12:37 · 891 阅读 · 35 评论 -
[双指针] --- 快乐数 && 盛最多水的容器
结合我们发现的规律以及对撞指针的原理,我们的。原创 2024-05-29 22:49:14 · 2605 阅读 · 48 评论 -
【双指针算法】--- 移动零 && 复写零
注意点:1.在找0时,如果遇到类似【1,2,3】这样的例子,可能会越界,所以我们需要加上一个限制条件2.在复写时,如果插入0的位置合法,我们正常插入;如果不合法(比如 【1 2 3 4 0】),我们仍然需要更新cur指针使它遍历完数组。原创 2024-05-22 22:44:09 · 1195 阅读 · 55 评论