双指针序列

最长连续不重复子序列

题目链接:799. 最长连续不重复子序列 - AcWing题库

双指针序列_第1张图片

 双指针序列_第2张图片

我的错误的思路:

1. 维护区间【i,j】

2.辅助数组 b[ ],记录这个数在这段区间里是否出现过

误区: 

1.标记有没有出现的话,i 每往后移一次,就需要将辅助数组全部置0一次,太耗费时间。

答案:

双指针序列_第3张图片 答案的妙处在于:

1.双指针维护一段区间 【j,i】维护一段区间

2.辅助数组cnt[ ],存储的是这个数在这段区间里(【j,i】)出现了多少次,而不是是否出现过。

出现了多少次:如果出现次数大于1,就说明这段区间里有重复值,否则没有。

3.用 i 遍历整个区间,j 只有当需要时才移动⭐

标记有没有出现的话,i 每往后移一次,就需要将辅助数组全部置0一次,太耗费时间。


数组元素的目标和 

800. 数组元素的目标和 - AcWing题库

双指针序列_第4张图片

 双指针序列_第5张图片

 答案:

双指针序列_第6张图片

答案的妙处在于

a数组从小变到大,b数组从大变到小。

这样当 a[x]+b[j]!=x 时,我们可以比较:

1.如果a[x]+b[j]>x,那就是sum大了,需要小一点,要么是a变小,要么是b变小,a一直取得是较小的值,不能再小了,所以唯一的办法是b变小,刚好b一直取得是较大的值,所以b变小,j--

2.如果a[x]+b[j]


判断子序列

 2816. 判断子序列 - AcWing题库

双指针序列_第7张图片 

自己的代码:

双指针序列_第8张图片

答案的代码:

双指针序列_第9张图片 

太妙了!运用了队列的先进先出性质!(感觉自己好久不写题都变笨了,居然没想到队列)

另一种答案:

#include
using namespace std;
const int N=1e5+5;
int a[N],b[N];
int main()
{
	int n,m;
	cin>>n>>m;
	for(int i=0;i>a[i];
	}
	for(int i=0;i>b[i];
	}
	//计算
	int j=0;
	for(int i=0;i

(个人感觉这才是双指针的思路所在!!!)

1.i指针用来扫描整个b数组,j指针用来扫描a数组。若发现a[j] == b[i],则让j指针后移一位。
2.整个过程中,i指针不断后移,而j指针只有当匹配成功时才后移一位,若最后若j== n,则说明匹配成功。 

对应了前边所写的 用 i 遍历整个区间,j 只有当需要时才移动⭐

你可能感兴趣的:(#,算法,算法)