题目链接:799. 最长连续不重复子序列 - AcWing题库
我的错误的思路:
1. 维护区间【i,j】
2.辅助数组 b[ ],记录这个数在这段区间里是否出现过
误区:
1.标记有没有出现的话,i 每往后移一次,就需要将辅助数组全部置0一次,太耗费时间。
答案:
1.双指针维护一段区间 【j,i】维护一段区间
2.辅助数组cnt[ ],存储的是这个数在这段区间里(【j,i】)出现了多少次,而不是是否出现过。
出现了多少次:如果出现次数大于1,就说明这段区间里有重复值,否则没有。
3.用 i 遍历整个区间,j 只有当需要时才移动⭐
标记有没有出现的话,i 每往后移一次,就需要将辅助数组全部置0一次,太耗费时间。
800. 数组元素的目标和 - AcWing题库
答案:
答案的妙处在于
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题库
自己的代码:
答案的代码:
太妙了!运用了队列的先进先出性质!(感觉自己好久不写题都变笨了,居然没想到队列)
另一种答案:
#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 只有当需要时才移动⭐