日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

(连续子序列)唯一的雪花

發布時間:2025/3/12 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (连续子序列)唯一的雪花 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目:

輸入一個長度為n(n<=1e6)的序列A,找到一個盡量長的連續子序列AL~AR,使得該序列中沒有相同元素。輸出最大長度。

分析與解答

對于這種子序列問題我們采用模擬的方法

方法一:利用set
1.如果有一個序列的元素沒出現過,就把元素存到set里,
2.如果出現過,說明a[r+1]在子序列a[l]——a[r]出現過,那此時就不斷地刪去l,直到r增大到n
注意這里并不是說我刪掉最左邊的,那么l+1到r+1就是一個新的滿足條件的最長子序列,比如1,2,3,4,5,4,6,7,8,9
這里只不過是把所有可能情況走一遍
左邊走,右邊停著
右邊走,左邊停著
決定誰停的條件,就是r+1是不是曾經出現過,用set的count函數非常方便,而且set也有插入和刪除,左邊往前走,刪除,右邊往前走,插入
3.注意保存并更新最大序列個數

#include<cstdio> #include<set> #include<algorithm> using namespace std; const int maxn=1000000+5; int a[maxn];int main(){int t,n;scanf("%d",&t);while(t--){scanf("%d",&n);for(int i=0;i<n;++i) scanf("%d",&a[i]);set<int> s;int l=0,r=0,ans=0;while(r<n){while(r<n&&!s.count(a[r])) s.insert(a[r++]);ans=max(ans,r-l);s.erase(a[l++]);}printf("%d\n",ans);} }

方法二
利用map
1.構造數組last[i],存的元素是下標i的上一個相同元素的下標
如果這個元素第一次出現,那么last[i]=-1
2.map分別存的是值和下標,cur[值]=下標
3.同樣是有一個l,last[r]與l進行比較,如果小于,說明此時可以繼續擴展
4.雖然麻煩,但是與抽屜原理異曲同工之妙

#include<stdio> #include<map>using namespace std;const int maxn=1000000+5; int a[maxn],last[maxn]; map<int,int>cur;int main(){int t,n;scanf("%d",&t);while(t--){scanf("%d",&n);cur.clear();for(int i=0;i<n;++i){scanf("%d",&a[i]);if(!=cur.count(a[i])) last[i]=-1;else last[i]=cur[a[i]];cur[a[i]]=i;//存a[i]的下標}int l=0,r=0,ans=0;while(r<n){while(r<n&&last[r]<l) r++;ans=max(ans,r-l);l++;}printf("%d\n",ans);} }

總結

以上是生活随笔為你收集整理的(连续子序列)唯一的雪花的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。