双指针算法最正确的理解

双指针算法正确理解

双指针算法


看到网上一堆对于双指针算法的理解,动不动就一堆证明贴上去,觉得真的很傻,明明很简单的一个问题非搞得那么复杂。下面请看最正确的理解(以一个算法题来解释):
下图是题目:

在这里插入图片描述
官方解法是:定义两个指针分别对应数组的第一个和最后一个元素,计算其面积,再将两个指针中小的那个向中间移动一次,再计算面积,如果面积比之前的大,则暂定其为最大面积,如此循环,当两个指针距离为一时,循环结束,返回最大面积。
一般的做法:两层for循环,将所有的可能性遍历一次,得出最大面积值。
不理解之处:很多人会觉得这样可能会漏掉一些解。
################################################################
其实这道题的一般解法是我们容易想到的,也是没有争议的,大家都理解,这就是排列组合的方式。但是这种方法太耗费时间,而双指针方法就是为了减少循环的次数,从而减少时间。
本质:双指针法也是排列组合,只不过它中间少了很多次组合方式。
开始理解:
0、我们还是按照排列组合的方式去理解双指针;
1、首先,选择两个元素,我们就按照双指针里,选择首尾两个;
2、这两个元素有一大一小时,我们选择较小的那个元素(一样大的话就选左边那个,无所谓),用其他所有的元素与之相组合(我们就这样一轮一轮的排列组合);
3、我们现在就以小的是左边那个元素为例,将他与其余所有元素结合,计算面积,发现,最后一个元素和他组合起来面积最大。因为,面积由短元素决定,现在我们按照短元素来组合,那么距离越大,面积越大,所以,在这一轮,只需要计算和最远的那个元素组合的面积。
4、上一轮结束,短的那个跟所有元素结合一遍, 最大的那个面积也选出来了,那么进行下一轮,将短元素向中间靠近一步,刚才的短元素我们就不用管了,这时指针还是在一堆元素的两头,他们没有进行过排列组合,我们再以短元素为基础,与其他的相组合,发现这些组合中最大面积一定是首尾两个组合时的面积,我们把这个组合计算出来即可。此时,短元素和其他所有元素也组合了一遍,这些组合的最大面积我们也知道了,那么,将短元素舍弃,将指针向内再进一步,如此循环,,,
5、当两个指针相邻时,一定所有的组合都遍历完成了。所以,一定不会有漏掉的组合。

结论:双指针方法只是在计算之前将那一轮不可能的组合省略了计算面积的这个步骤,所以,不会有最优解被漏掉这种情况。它的核心就是:一轮一轮的组合,把本轮最大面积算一下存起来,一轮组合结束,将该元素舍弃,进行下一轮组合,这样进行下去,一定可以得到最大面积。

最后:双指针就是排列组合,只不过每一轮简化之后,只需要进行一次计算,我们要理解它简化的原理。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
KMP算法是一种字符串匹配算法,可以在一个字符串中快速查找另一个字符串是否出现。它的核心思想是通过预处理模式串,使匹配过程中不回溯主串。 KMP算法的实现需要用到一个next数组,它记录了模式串中每个位置之前最长的相同前缀后缀长度。通过next数组,就可以在匹配过程中将模式串向右移动,而不需要回溯主串。 下面是KMP算法的Python实现: ```python def kmp(text, pattern): n, m = len(text), len(pattern) # 计算next数组 nxt = [0] * m j = 0 for i in range(1, m): while j > 0 and pattern[i] != pattern[j]: j = nxt[j-1] if pattern[i] == pattern[j]: j += 1 nxt[i] = j # 匹配过程 j = 0 for i in range(n): while j > 0 and text[i] != pattern[j]: j = nxt[j-1] if text[i] == pattern[j]: j += 1 if j == m: return i - m + 1 return -1 ``` 其中,nxt数组的计算过程是通过两个指针i和j完成的。i从1开始遍历模式串,j从0开始,如果模式串中i位置的字符和j位置的字符不相同,则j指针向前回溯,直到找到一个位置k,使得模式串中0~k-1位置的子串和i-k+1~i位置的子串相同。这个k就是nxt[i]。 在匹配过程中,i从0开始遍历主串,j从0开始,如果主串中i位置的字符和模式串中j位置的字符不相同,则j指针向前回溯,直到找到一个位置k,使得模式串中0~k-1位置的子串和主串中i-k+1~i位置的子串相同。如果j指针到达了模式串的末尾,说明匹配成功,返回匹配的位置i-m+1。 通过这种方式,KMP算法可以在O(n+m)的时间复杂度内完成字符串匹配。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值