个人笔记02:双指针问题 | 豆包MarsCode AI刷题

67 阅读3分钟

方向一笔记-个人笔记02:双指针问题

双指针可以是同一个数组相同位置开始、步长有差异(即快慢指针)的两个指针,可以是同一个数组不同位置开始、依照条件选择其中一个前进的两个指针,还可以是不同数组的两个指针。通常来说,双指针方法是在有序数组的基础上实现的,所以往往要先调用Python(或C++等)中的sort函数(平均时间复杂度为O(nlogn),n为数组长度)。

例1:小U的早餐选择计算

小U同学每天在早餐店有多种主食和饮料可以选择。给定两个数组,staples表示不同主食的价格,drinks 表示不同饮料的价格。每天早上,小U最多会花费不超过x元,他可能选择一份主食、一杯饮料,或只选择主食或饮料中的一个。你的任务是计算小U每天早上有多少种不同的选择,满足其最大花费不超过x。

(思路)首先对staples,drinks进行sort()处理,使其成为非递减序列。分别记staples和drinks的长度为n1和n2,同时用i和j分别作为两个数组的索引(指针)。

(1)首先考虑只选择主食或饮料的情况,即i和j各自从0开始遍历,直到staples[i]或drinks[j]大于x。i+j为答案的一部分。

(2)同时选择主食和饮料,i从0开始遍历,j从n2-1出发,对于每个i,j递减至满足staples[i]+drinks[j]<=x时停止递减,只要j>=0,则答案加上(j+1)。从效果上看,这相当于i和j交替变化(i增大,j减小)。

(复杂度分析)时间复杂度为O(n1+n2),空间复杂度为O(1)。

 

例2:找出最长的神奇数列

小F是一个好学的中学生,今天他学习了数列的概念。他在纸上写下了一个由0 和1组成的正整数序列inp,长度为n。这个序列中的1和0交替出现,且至少由3个连续的0和1组成的部分数列称为「神奇数列」。如果有多个神奇数列,那么输出最先出现的一个。

(思路)记inp中0、1交替的序列起始索引为s,长度为len,即子序列inp[s:s+len]。初始时置s=0,len=1,终止索引e从1开始遍历,如遇到inp[e]!=inp[e-1],则序列继续延伸,len递增,否则比较当前序列长度与最长序列长度确认答案是否更新为当前序列,然后重新置s=e,len=1。注意退出数组遍历后,还要再比较一遍len和最长序列长度,同时本题最长序列长度至少为3,否则返回空字符串。