799. 最长连续不重复子序列

记录每个数字出现次数,如果又多次出现就从当前位置重新开始计算长度

      #include <iostream>
      using namespace std;

      const int N = 100010;
      int n;
      int q[N],s[N];

      int main()
      {
          scanf("%d",&n);
          for (int i=0;i<n;i++) scanf("%d",&q[i]);//似乎是非降序排列

          int res = 0;
          for (int i=0,j=0;i<n;i++)
          {
              s[q[i]]++;//给数组记录出现次数
              while (j<i && s[q[i]]>1) s[q[j++]]-- ;//当出现次数大于一就不是不重复的,
              //就一直从左指针开始减,直到当前位置减到一,从当前位置重新开始,   j是左指针  i是右指针
              res = max(res,i-j+1);
          }

          cout<<res<<endl;

          return 0;
      }
posted @ 2022-08-26 23:59  天然气之子  阅读(12)  评论(0编辑  收藏  举报