- 博客(100)
- 收藏
- 关注
原创 判断一个点是否在三角形内部
但是如果点2在1-》3边的左边,那么按照点1、点2和点3的顺序就有问题,因为这个顺序是顺时针,所以应该按照点1、点3和点2的顺序。新的标准有了,接下来解决一个棘手的问题。我们知道作为参数传入的三个点的坐标代表一个三角形,可是这三个点一次的顺序不一定是逆时针的,比如,如果参数的顺序伟A坐标、B坐标和C坐标,那么就没问题了,因为这是逆时针。在二维坐标系中,所有的值都事double类型,那么一个三角形可以由3个点来代表,给定3个点代表的三角形,再给定一个点(x,y),判断(x,y)是否在三角形中。
2025-11-19 10:42:02
265
原创 判断一个点是否在矩形内部(9)1117
这种情况是比较简单的,因为矩形的边不是平行于x轴就是平行于y轴,所以判断该点是否完全在矩形的左侧、右侧、上侧或者下侧,如果都不是,就一定在其中,如果矩形的边不平行于坐标轴呢?在二维坐标系中,所有的值都是double类型,那么一个矩形可以由4个点来代表,(x1,y1)为最左的点,(x2,y2)为最上的点、(x3,y3)为最下的点,(x4,y4)为最右的点。关于旋转的公式,对于矩形的每个顶点(x,y)绕旋转中心(cx,cy)旋转角度α的坐标变换公式。本题是以(0,0)为中心旋转的。
2025-11-17 09:38:22
190
原创 书籍子数组的最大累加和问题(8)0722
遍历到-2,cur = cur - 2 = -1,开始出现负的累加和,所以,说明[1,-2]这一部分肯定不会作为产生最大累加和的子数组的左边部分,于是令cur=0,max不变。遍历到-2,cur=cur-2=6,虽然累加了一个负数,但是cur依然大于0,说明累加的这一部分(也就是[3,5,-2])仍可能作为最大累加和的子数组的左边部分。例如,arr=[1,-2,3,5,-2,6,-1],所有的子数组中,[3,5,-2,6]可以累加出最大的和12,所以返回12。给定一个数组arr,返回子数组的最大累加和。
2025-11-17 09:15:43
179
原创 书籍数组排序之后相邻数的最大差值(8)0818
本题如果用排序法实现,其时间复杂度是O(NlogN),而如果利用桶排序的思想(不是直接进行桶排序),可以做到时间复杂度为O(N),额外空间复杂度为O(N)。arr中在[min,max]范围上的数放在1~N号桶,对于1~N号桶中的每一个桶来说,负责的区间大小为(max-min)/N。区间[10,20)的数全部放在1号桶里,区间[20,30)的数全部放在2号桶里……arr一共有N个数,min一定会放进1号桶里,max一定会放进最后的桶里,所以,如果把所有的数放入N+1个桶中,必然有桶是空的。
2025-08-18 09:18:34
169
原创 书籍数组中未出现的最小正整数(8)0812
6、如果arr[arr[l]-1] == arr[l]。可是此时发现arr[l]-1位置上的数已经是arr[l],说明出现了两个arr[l],既然在[l+1,r]上出现了重复值,那么[l+1,r]范围上的数又少了一个,所以与步骤4和步骤5一样,把arr最后位置的数(arr[r-1])放在位置l上,下一步检查这个数,然后令r--。没有遍历arr[l]之前,arr已经包含的正整数范围是[1,l],此时出现了arr[l] == l+1的情况,所以arr包含的正整数范围可以扩到[1,l+1],即令l++。
2025-08-12 18:35:26
184
原创 书籍求最短通路值(8)0811
1、开始时生成map矩阵,map[i][j]的含义是从(0,0)位置走到(i,j)位置最短的路径值。直到遇到右下角位置,说明已经找到终点,返回终点在map中的值即可,如果rQ和cQ已经为空都没有遇到终点位置,说明不存在这样一条路径,返回0。4、在步骤3中,如果一个位置之前走过,就不要重复走,这个逻辑可以根据一个位置在map中的值来确定,比如map[i][j]!用一个 整型矩阵matrix表示一个网络,1代表有路,0代表无路,每一个位置只要不越界,都有上下左右4个方向,求从最左上角到最右下角的最短通路值。
2025-08-11 08:48:03
175
原创 书籍数组的partition调整(8)0807
2)如果arr[index] == 0,这个值应该加入到左区,arr[left+1]是中区最左的位置,所以把arr[index]和arr[left+1]交换之后,左区就扩大了,index++之后重复步骤4。2、生成变量i,利用i做从左到右的遍历,在arr[u+1...i]上是不保证没有重复元素且升序的区域,i是这个区域最后的位置,初始时i=1,这个区域记为B。例如,arr=[1,2,2,2,3,3,4,5,6,6,7,7,8,8,8,9],调整之后arr=[1,2,3,4,5,6,7,8,9,……
2025-08-07 09:11:39
359
原创 书籍不包含本位置值得累乘数组(8)0806
如果数组中有1个0,对唯一的arr[i]==0的位置令res[i]=all,其他位置上的值都是0即可。lr[]表示从左到右的累乘(即lr[i]=arr[0..i])的累乘。2、一个位置上除去自己的累乘,就是自己左边的累乘再乘以自己右边的累乘,即res[i] = lr[i-1] * rl[i+1]。3、最左边的位置和最右位置的累乘比较特殊。即res[0] = rl[i],res[N-1] = lr[N-2]。例如:arr=[2,3,1,4],返回[12,8,24,6],即除自己外,其他位置上的累乘。
2025-08-06 09:23:49
141
原创 书籍边界都是1的最大正方形大小(8)0804
对down矩阵来说,如果matrix[i][n-1]==1,因为down[i+1][n-1]表示包括位置(i+1,n-1)在内并往下有多少个连续的1,所以,如果位置(i,n-1)是1,那么,令down[i][n-1]=down[i+1][n+1]+1;如果matrix[i][n-1]==0,则令down[i][n-1]=0。1)从矩阵的右下角(n-1,n-1)位置开始计算,如果matrix[n-1][n-1]==1,那么,right[n-1][n-1]=1且down[n-1][n-1]=1,否则都等于0。
2025-08-05 09:51:41
604
原创 书籍打印N个数组整体最大的TopK(8)0731
那么就把heap中最后一个元素放在heap头部的位置,然后把heap的大小减1(heapSize - 1),最后依然从堆的头部开始调整堆,使其重新变为大根堆(堆大小减1之后的heapify过程)。1、构建一个大小为N的大根堆heap,建堆的过程就是把每一个数组中的最后一个值,也就是该数组的最大值,依次加入到堆里,这个过程是建堆时的调整过程(heapInsert)。有N个长度不一的数组,所有的数组都是有序的,请从大到小打印这N个数组整体最大的前K个数。本题的解法是利用堆结构和堆排序的过程完成。
2025-08-01 09:08:45
144
原创 书籍数组中子数组的最大累乘积(8)0729
也就是说,结果Max={以arr[0]结尾的所有子数组的最大累乘积,以arr[i]结尾的所有子数组的最大累乘积……min既然表示以arr[i-1]结尾的最小累乘积,当然有可能min是负数,而如果arr[i]也是负数,两个负数相乘的结果也可能很大。max既然表示以arr[i-1]结尾的最大累乘积,那么当然有可能以arr[i]结尾的最大累乘积是max*arr[i]。3、可能仅是arr[i]的值。这三种可能的值中最大的那个就是作为以i位置结尾的最大累乘积,最小的作为最小累乘积,然后继续计算i+1位置结尾的时候。
2025-07-29 09:17:56
316
原创 书籍在数组中找到一个局部最小的位置(8)0725
arr长度为1时,arr[0]是局部最小。如果0<i<N-1,即有arr[i]<arr[i-1],又有arr[i] < arr[i+1],那么arr[i]是局部最小。1)如果arr[mid] > arr[mid-1],可知在arr[left..mid-1]上可肯定存在局部最小,令right=mid-1,重复步骤5.2、如果arr长度为1或者arr[0]<arr[1],说明arr[0]是局部最小,返回0。3、如果arr[N-1]<arr[N-2],说明arr[N-1]是局部最小,返回N-1。
2025-07-25 09:34:04
185
原创 书籍子矩阵的最大累加和问题(8)0724
可以把两列的元素累加,然后得到累加数组[-1,7,-6,4],接下来求这个累加数组的最大累加和,结果是7。这个矩阵的累加数组就是在上一步累加数组[64,-40,64]的基础上,依次在每个位置上加上矩阵最新一行[-81,-7,66]的结果,即[-17,-47,130],这个数组的最大累加和为130。这个矩阵的累加数组就是在上一步的累加数组[-90,48,78]的基础上,依次在每个位置上加上矩阵最新一行[64,-40,64]的结果,即[-26,8,142],这个数组的最大累加和为150。
2025-07-24 09:28:53
375
原创 子数组的最大累加和问题(8)0718
遍历到-2,cur=cur-2=-1,开始出现负的累加和,所以说明[1,-2]这一部分肯定不会作为产生最大累加和的子数组的左边部分,于是令cur=0,max不变。遍历到-2,cur=cur-2=-6,虽然累加了一个负数,但是cur依然大于0,说明累加的这一部分(也就是[3,5,-2])仍可能作为最大累加和子数组的左边部分。遍历到-1,cur=cur-1=11,max不更新。例如,arr=[1,-2,3,5,-2,6,-1],所有的子数组中,[3,5,-2,6]可以累加出最大的和12,所以返回12.
2025-07-18 09:09:59
176
原创 书籍奇数下标都是奇数或者偶数下标都是偶数(8)0717
此时end=6为偶数,所以6和arr[even = 0]交换,数组变成[6,8,3,2,4,1],even=even+2=2。此时end=1为奇数,所以1和arr[odd=1]交换,数组变成[6,1,3,2,4,8],odd=odd+2=3。此时end=8为偶数,所以8和arr[even=2]交换,数组变成[6,1,8,2,4,3],even=even+2=4。此时end=2为偶数,所以2和arr[odd=4]交换,数组变成[6,1,8,3,2,4],even = even + 2 = 6。
2025-07-17 09:10:39
321
原创 书籍自然数数组的排序(8)0715
举例说明,比如[1,2,5,3,4],假设遍历到位置2,也就是5这个数。5应该放在位置4上,所以把5放过去,数组变成[1,2,5,3,5]。同时,4这个数是被5替下来的数,应该放在位置3,所以把4放过去,数组变成[1,2,5,4,5]。同时3这个数是被4替下来的数,应该放在位置2,所以把3放过去,数组变成[1,2,3,4,5]。给定一个长度为N的整型数组arr,其中有N个互不相等的自然数1~N,请实现arr的排序,但是不要把下标0~N-1位置上的数通过直接赋值的方式替换成1~N。3、如果arr[i]!
2025-07-15 09:52:32
197
原创 书籍计算数组的小和(8)0714
例如,数组arr=[1,3,5,2,4,6],在s[0]的左边小于或等于s[0]的数的和为0,在s[1]的左边小于或等于s[1]的数的和为1,在s[2]的左边小于或等于s[2]的数的和为1+3=4,在s[3]的左边小于或等于s[3]的数的和为1,在s[4]的左边小于或等于s[4]的数和为1+3+2=6,在s[5]的左边小于或等于s[5]的数的和为1+3+5+2+4=15,所以s的小和为0+1+4+1+6+15=27。3、[1,3]与[5]合并。同理,3和5比较,产生小和为3*1=3,合并为[1,3,5]。
2025-07-10 09:32:53
327
原创 书籍未排序数组中累加和小于或等于给定值的最长子数组长度
5、j=3时,sum[0..3]=-3,所以在helpArr中二分查找大于或等于-3-k=3-(-2)=-1这个值第一次出现的位置,在helpArr中位置是0,对应的arr中的位置是-1,表示一个数都不累加的情况,所以arr[0..3]是满足条件的最长数组。1、arr=[3,-2,-4,0,6],求得arr的累加数组sumArr=[0,3,1,-3,-3,3],进一步求得sumArr的左侧最大值数组[0,3,3,3,3,3]。在这样一个有序的数组中,就可以二分查找大于或等于某一个值的累加和最早出现的位置。
2025-07-09 09:15:53
377
原创 书籍未排序数组中累加和为给定值的最长子数组系列问题(8)0704
根据之前得出的结论,arr[j+1..i]的累加和为s(i)-s(j),此时s(i)=sum,又有s(j)=sum,又有s(j)=sum-k,所以arr[j+1..i]的累加和为k。那么字数组arr[j..i](0<=j<=i<arr.length)的累加和为s(i) - s(j-1),因为根据定义,s(i) = arr[0..i]的累加和=arr[0..j-1]的累加和+arr[j..i]的累加和,又有arr[0..j-1]的累加和为s(j-1)。比如,数组[1,2,3,3],k=6。
2025-07-04 10:11:30
408
原创 书籍未排序正数数组中累加和为给定值的最长子数组长度(8)0703
如果sum==k,说明arr[left..right]累加和为k,如果arr[left..right]长度大于len,则更新len,此时因为数组中所有的值都为正数,那么所有从left位置开始,在right之后的位置结束的子数组,即arr[left..i(i>right)],累加和一定大于k。所以,令left加1,这表示我们开始考查以left之后的位置开始的子数组,同时令sum-=arr[left],sum此时表示arr[left + 1 .. right]的累加和。需要注意的是,right加1后是否越界。
2025-07-03 09:22:10
263
原创 书籍不重复打印排序数组中相加和为给定值的所有二元组和三元组
只需要在打印时增加一个检查即可,检查arr[left]是否与它前一个值arr[left-1]相等,如果相等就不打印。具体解释为:因为整体过程是从两头向中间压缩的过程,如果arr[left] + arr[right] == k,又有arr[left] == arr[left -1],那么之前一定已经打印过这个二元组,此时无须重复打印。比如arr=[1,1,1,9],k=10。如果sum等于k,打印"arr[left],arr[right]",则left++,right++。如果sum小于k,left++。
2025-07-01 08:56:07
183
原创 书籍最长的可整合子数组的长度(8)0627
比如[3,2,5,6,4],max-min+1 = 6 -2 +1=5==元素个数,所以这个数组是可整合数组。例如,[5,3,4,6,2]排序之后为[2,3,4,5,6],符合每相邻两个数差的绝对值都为1,所以这个数组为可整合数组。需要注意的是,在考查每一个arr[i..j]是否符合可整合数组定义的时候,都得把arr[i..j]单独复制成一个新的数组,然后把这个新的数组排序、验证,而不能直接改变arr中元素的顺序。例如,[5,5,3,2,6,4,3]的最大可整合子数组为[5,3,2,6,4],所以返回5。
2025-06-27 09:45:56
178
原创 书籍在行列都排好序的矩阵中找数(8)0626
如果比K小,因为矩阵每一行都已排好序,所以在当前数所在的行中,处于当前数左方的数都会比K小,则没有必要继续在第row行上寻找,令row = row + 1,重复步骤2。如果比K大,因为矩阵每一列都已排好序,所以在当前数所在的列中,处于当前数下方的数都会比K大,则没有必要继续在第col列上寻找,令col=col-1,重复步骤2.给定一个有N*M的整型矩阵matrix和一个整数K,matrix的每一行和每一列都是排好序的。实现一个函数,判断K是否在matrix中。如果与K相等,说明已找到,直接返回true。
2025-06-26 09:11:01
284
原创 书籍在数组中找到出现次数大于N/K的数(8)0617
具体的过程为,一次在数组中删掉两个不同的数,不停地删除,知道剩下的数只有一种,如果一个数出现次数大于一半,这个数最后一定会剩下来。综上所述,第一个for循环的实质就是我们的核心解题思路,一次在数组中删掉两个不同的数,不停地删除,知道剩下的数只有一种,如果一个数出现次数大于一半,则这个数最后一定被剩下来,也就是最后的cand值。方法的核心思想,一次在数组中删掉K个不同的数,不停地删除,直到剩下数的种类不足K就停止删除,那么,如果一个数在数组中出现了次数大于N/K,则这个数最后一定会被生下来。
2025-06-17 09:43:08
331
原创 书籍需要排序的最短子数组长度(8)0616
假设当前数位arr[i],如果arr[i] > min,说明如果要整体有序,min值必然会挪到arr[i]的左边。如果遍历完成后,noMinIndex依然等于-1,说明从右到左始终不升序,原数组本来就有序,直接返回0,即完全不需要排序。接下来从左向右遍历,遍历的过程中记录左侧出现过的数的最大值,记为max。假设当前数位arr[i],如果arr[i] < max,说明如果排序,max值必然会挪到arr[i]的右边。例如:arr=[1,5,3,4,2,6,7]返回4,因为只有[5,3,4,2]需要排序。
2025-06-16 09:14:00
154
原创 书籍找到无序数组中最小的k个数(8)0611
如果数组arr的长度为N,排序之后自然可以得到最小的k个数,此时间复杂度与排序时间复杂度相同,均为O(NlogN)。本题要求实现时间复杂度为O(Nlogk)和O(N)的方法。O(Nlogk)的方法,就是一直维护一个有k个数的大根堆,这个堆代表目前选出的k个最小的数,在堆里的k个元素中堆顶的元素是最小的k个数里最大的那个。在遍历完成后,堆中的k个数就是所有数组中最小的k个数。大根堆:根节点的关键字是堆里所有节点关键字中最大者,属于二叉堆的两种形式之一。的关键字值,又大于或等于右子树的关键字值。
2025-06-12 09:23:01
226
原创 书籍“之“字形打印矩阵(8)0609
1.上坐标(tR,tC)初始为(0,0),先沿着矩阵第一行移动(tC++),当到达第一行最右边的元素后,再沿着矩阵最后一列移动(tR++)。2.下坐标(dR,dC)初始为(0,0),先沿着矩阵第一列移动(dR++),当到达第一列最下边的元素时,再沿着矩阵最后一行移动(dC++)。3.上坐标与下坐标同步移动,每次移动后的上坐标与下坐标的连线就是矩阵中的一条斜线,打印斜线上的元素即可。”之“字形打印的结果为:1,2,5,9,6,3,4,7,10,11,8,12。
2025-06-09 09:25:18
388
原创 书籍将正方形矩阵顺时针转动90°(8)0605
在这个外围圈中,1,4,16,13为一组,然后让1占据4的位置,4占据16的位置,16占据13的位置,13占据1的位置,一组就调整完了。然后2,8,15,9一组,继续占据调整的过程,最后3,12,14,5为一组,继续占据调整的过程。然后(tR,tC)=(0,0)、(dR,dC)=(3,3)的子矩阵外层就调整完毕。比如,题目中的矩阵,当(tR,tC)=(0,0)、(dR,dC)=(3,3)时,表示的子矩阵就是整个矩阵,那么这个子矩阵最外层的部分如下。额外空间复杂度为O(1)。
2025-06-05 09:56:25
624
原创 书籍转圈打印矩阵(8)0604
如果能把这个子矩阵的外层转圈打印出来,那么在(tR,tC)=(0,0)、(dR,dC)=(3,3)时,打印的结果为:1,2,3,4,8,12,16,15,14,13,9,5。再把这个子矩阵转圈打印出来,结果为:6,7,11,10。把tR和tC加1,即(tR,tC)=(2,2),令dR和dC减1,即(dR,dC)=(1,1)。打印结果为:1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10。给定一个整型矩阵matrix,请按照转圈的方式打印它。额外空间复杂度为O(1)
2025-06-04 09:40:16
360
原创 书籍在其他数都出现k次的数组中找到只出现一次的数(7)0603
首先设置一个变量eO,它是一个32位的k进制数,且每个位置上都是0。然后遍历arr,把遍历到的每一个整数都转换为k进制数,然后与eO进行无进位相加。因为k个相同的k进制数无进位相加,结果一定是每一位上都是0的k进制数,所以只出现一次的那个数最终就会剩下来。k进制的两个数c和d,在i位上无进位相加的结果就是(c(i) + d(i) )% k。那么,如果k个相同的k进制进行无进位相加,相加的结果一定是没一位上都是0的k进制数。已知arr中只有1个数出现了1次,其他的数都出现了k次,请返回只出现了1次的数。
2025-06-03 14:39:56
258
原创 书籍在其他数都出现偶数次的数组中找到出现奇数次的数(7)0530
所以,如果数组中有两个出现了奇数次的数,最终的eO一定不等一0。在这次遍历时,eOhasOne只与第k位上是1的整数异或,其他的数忽略。那么在第二次遍历结束后,eOhasOne就是a或者b中的一个,而eO^eOhasOne就是另一个出现奇数次的数。整数n与0异或的结果是n,整数n与整数n异或的结果是0。在遍历数组的过程中,把eO和每个数异或(eO=eO^当前数),最后eO的值就是出现了奇数次数的那个数。给定一个整型数组arr,其中只有一个数出现了奇数次,其他的数都出现了偶数次,打印这个数。
2025-05-30 09:09:28
258
原创 书籍整数的二进制表达中有多少个1(7)0529
在同时进行的前提下,可以将计算的过程分解成小部分,之后以并发方式来加以解决,或指用多台处理机联合求解问题的方法和步骤,其执行过程是将给定的问题首先分解成若干个尽量相互独立的子问 题,然后使用多台计算机同时求解它,从而最终求得原问题的解。平行算法,将32位分别分成5组,分别为2为一组(一个0,一个1),4位一组(2个0,2个1),8位一组(4个0,4个1)……给定一个32位整数n,可为0,可为正,可为负,返回该整数二进制表达中1的个数。上面的方法需要循环32次,下面看循环次数只与1的个数有关的解法。
2025-05-29 09:34:36
210
原创 书籍只用位运算不用算术运算实现整数的加减乘除运算(7)0528
如果不再考虑进位的情况下,a^b就是正确结果,因为0加0位0(0&0),0加1为1(0&1),1加0为1(1&0),1加1为0(1&1)实现a-b只要实现a+(-b)即可,根据二进制数在机器中的表达规则,得到一个数的相反数,就是这个数的二进制数表达取反加1(补码)的结果。在只算进位的情况下,也就是只考虑a和b的过程中进位产生的值是什么,结果就是(a&b)<<1,因为在第i位上只有1与1相加才会产生i+1位的进位。5、计算(a-(c*b)/b)的结果,记为rest,意义是修正值,即-5/5=-1。
2025-05-28 10:02:32
293
原创 书籍不用任何比较判断找出两个数中较大的数
sign函数的功能是返回整数n的符号,正数和0返回1,负数则返回0。flip函数的功能是如果n为1,返回0,如果n为0,返回1。所以,如果a-b的结果为0或正数,那么scA为1,scB为0;如果a-b的值为负数,那么scA为0,scB为1。,就是根据a-b的值的状况,选择要么返回a,要么返回b。符号右移(>>):二进制向右移,保留符号位,高位补符号位(整数补0,负数补1),相当与除以2的n次方。但方法是有局限性的,那就是如果a-b的值出现溢出,返回结果就不正确。异或运算(^):相同为0,不同为1。
2025-05-26 09:40:55
173
原创 书籍一致性哈希算法的基本原理
首先把该数据的id用哈希函数算出哈希值,并射到环中的相应位置,然后顺时针找寻离这个位置最近的机器,那么机器就是该数据的归属。题目中描述的缓存策略的潜在问题是如果增加或删除机器时(N变化)代价会很高,所有的数据都不得不根据id重新计算一遍哈希值,并将哈希值对新的机器数进行取模操作,然后进行大规模的数据迁移。2、如果目前机器有N台,则计算key%N的值,这个值就是该数据所属的机器编号,无论是添加、删除还是查询操作,都只在这台机器上进行。工程师常使用服务器集群来设计和实现数据缓存,以下是常见的策略。
2025-05-21 10:31:49
198
原创 书籍40亿非负整数中找到出现两次的数和所有数的中位数
怎么使用这个bitArr数组呢?遍历这40亿个无符号数,如果初次遇到num,就把bitArr[num*2 + 1]和bitArr[num*2]设置为01,如果第二次遇到num,就把bitArr[num*2 + 1]和bitArr[num*2]设置为10,如果第三次遇到num,就把bitArr[num*2 + 1]和bitArr[num*2]设置为11。遍历完成后,再次遍历bitArr,如果发现bitArr[i*2 + 1]和bitArr[i*2]设置为10,那么i就是出现了两次的数。
2025-05-19 16:15:19
238
原创 书籍布隆过滤器优点说明
哈希函数的输入域可以是非常大的范围,比如,任意一个字符串,但是输出域是固定的范围。布隆过滤器的优势就在于使用很少的空间就可以将准确率做到很高的程度。
2025-04-30 15:37:18
144
原创 字典树(前缀树)的实现(5)0423
先调用search(word),看word再不在Trie树中,若在,则执行后面的过程,若不在,则直接返回,从左到右遍历word中的每个字符,并依次从头节点开始根据每一个word[i]找到下一个的节点,在找的过程中,把扫过每一个节点的path值减1。4、一直向下搜索,如果单词搜索完后,找到的最后一个节点是一个终止节点,说明字典树中含有这个单词,如果找到的最后一个节点不是一个终止节点,说明单词不是字典树中添加过的单词。和查找操作同理,根据pre不断找到节点,假设最后的节点记为e,返回e.path的值即可。
2025-04-23 15:31:01
500
原创 书籍字符串匹配问题(5)0409
如果exp[i..elen-1]="A*B*",也能匹配""。所以如果把递归函数p在所有不通参数(si和ei)的情况下的所有返回值看作一个范围,这个范围就是一个(slen+1)*(elen+1)的二维数组,并且p(si,ei)代表p(i,j)的返回值,dp[i][j]就是只依赖dp(si+1,ei+1)或者p(si+k(k>=0),ei+2),假设二维数组dp[i][j]代表p(i,j)的返回值,dp[i][j]就只是依赖dp[i+1][j+1]或者dp[i+k(k>0)][j+2]的值。
2025-04-10 15:53:15
562
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅