本文主要是介绍【Leetcode刷题】q904-水果成篮(用三个指针来解决),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目
本题具体内容见Leetcode-q904。
解题思路
先上个结果,这也太扯了。。。
该问题翻译成人话就是:求长度最大的、只包含两个数字的连续数组的长度。
一开始我是沿着双指针法的思路去做的:
每次循环,slow和fast都要在新的fruit1位置上,然后fast往后遍历,遍历步骤:
- fast先找到fruit2是谁;
- fast继续遍历,直到遇到fruit3,计算length,和max比较;
- slow和fast都赋值为fast-1.
上述做法有个非常明显的问题,那就是最后一步,更新slow的时候,这种双指针法,更新slow是在当前子数组的末尾,但是如果末尾是重复数组,如[0,1,6,6,4,4,6],当处理1,6,6这个子数组时,结束后,slow和fast被赋值到了3,然而实际上,应该赋值为6连续出现的第一个位置。而我们的slow和fast功能已经无法改动了,因此这里引入第三个指针,anchor,用于记录对每个子数组进行划窗分析的时候,下一个子数组应该开始的位置。
至于anchor的更新,应该遵循以下原则:
- 在一开始找fruit2的时候,一找到fruit2,就给anchor赋值为fast;
- 此后,一旦fast和fast-1不相等,就给anchor重新赋值为fast(主要是避免1,6,1,6,1,6这种情况)。
至此,上述问题就解决了。
代码
这篇关于【Leetcode刷题】q904-水果成篮(用三个指针来解决)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!