zoukankan      html  css  js  c++  java
  • 【uva 11572】Unique Snowflakes(算法效率--滑动窗口,3种实现方法)

    题意:求长度为N的序列中,最长的一个无重复元素的连续子序列。

    解法:[L,R]每次R++或L++延伸就可以得到答案。

    实现:(1)next[],last[]——O(n);

     1 #include<cstdio>
     2 #include<cstdlib>
     3 #include<cstring>
     4 #include<iostream>
     5 #include<algorithm>
     6 using namespace std;
     7 #define N (int)1e6+10
     8 
     9 struct node{int x,d,t;}a[N],b[N];
    10 int hou[N],last[N];
    11 int n,m,i,j,k;
    12 
    13 bool cmp(node x,node y) {return x.x<y.x;}
    14 int mmax(int x,int y) {return x>y?x:y;}
    15 void input()
    16 {
    17     scanf("%d",&n);
    18     for (i=1;i<=n;i++)
    19     {
    20       scanf("%d",&a[i].x);
    21       a[i].t=i;
    22     }
    23 }
    24 void init()
    25 {
    26     memcpy(b,a,sizeof(a));
    27     sort(b+1,b+1+n,cmp);
    28     m=1,a[b[1].t].d=m;
    29     for (i=2;i<=n;i++)
    30     {
    31       if (b[i].x!=b[m].x) b[++m]=b[i];
    32       a[b[i].t].d=m;
    33     }
    34     memset(hou,-1,sizeof(hou));
    35     for (int i=1;i<=n;i++)
    36     {
    37       last[i]=hou[a[i].d];
    38       hou[a[i].d]=i;
    39     }
    40 }
    41 int solve()
    42 {
    43     int l=1,r=1,ans=0;
    44     while (r<=n)
    45     {
    46       while (r<=n&&last[r]<l) r++;
    47       ans=mmax(ans,r-l);
    48       l++;
    49     }
    50     return ans;
    51 }
    52 int main()
    53 {
    54     int T;
    55     scanf("%d",&T);
    56     while (T--)
    57     {
    58       input();
    59       init();
    60       printf("%d
    ",solve());
    61     }
    62     return 0;
    63 }
    64  1
    Code1

    (2)set.insert(),count(),erase()——O(nlogn);

     1 #include<cstdio>
     2 #include<set>
     3 #include<algorithm>
     4 using namespace std;
     5 const int maxn = 1000000 + 5;
     6 int A[maxn];
     7 int main( ) {
     8 int T, n;
     9 scanf("%d", &T);
    10 while(T--) {
    11 scanf("%d", &n);
    12 for(int i = 0; i < n; i++) scanf("%d", &A[i]);
    13 set<int> s;
    14 int L = 0, R = 0, ans = 0;
    15 while(R < n) {
    16 while(R < n && !s.count(A[R])) s.insert(A[R++]);
    17 ans = max(ans, R - L);
    18 s.erase(A[L++]);}
    19 printf("%d
    ", ans);
    20 }
    21 return 0;
    22 }
    Code2(from 紫书)

    (3)map.clear(),count()——O(nlogn)。

     1 #include<cstdio>
     2 #include<map>
     3 using namespace std;
     4 const int maxn = 1000000 + 5;
     5 int A[maxn], last[maxn];
     6 map<int, int> cur;
     7 int main( ) {
     8 int T, n;
     9 scanf("%d", &T);
    10 while(T——) {
    11 scanf("%d", &n);
    12 cur.clear( );
    13 for(int i = 0; i < n; i++) {
    14 scanf("%d", &A[i]);
    15 if(!cur.count(A[i])) last[i] = -1;
    16 else last[i] = cur[A[i]];
    17 cur[A[i]] = i;
    18 }int L = 0, R = 0, ans = 0;
    19 while(R < n) {
    20 while(R < n && last[R] < L) R++;
    21 ans = max(ans, R - L);
    22 L++;
    23 } p
    24 rintf("%d
    ", ans);
    25 } r
    26 eturn 0;
    27 }
    Code3(from 紫书)
  • 相关阅读:
    超简单留言版
    DirectorySearCh的PropertiesToLoad所有属性
    "Asp.Net Web Api MediaTypeFormatter Error for xwwwformurlencoded data" 解决方法
    关于 NPOI 报 Invalid column index (256). Allowable column range for BIFF8 is (0..255) or ('A'..'IV') 错误的解决办法
    Autofac 的构造函数注入方式
    VirtualBox 内的 Ubuntu Server 虚拟机网络配置
    AngularJS 中设置 AJAX get 请求不缓存的方法
    IIS中使用LocalDB遇到错误:error 50,Local Database Runtime error occurred.的解决办法
    升级 DNX 和 DNVM
    规约模式学习总结
  • 原文地址:https://www.cnblogs.com/konjak/p/5977207.html
Copyright © 2011-2022 走看看