UVa 11572 唯一的雪花(滑動視窗)

2021-09-26 23:26:25 字數 927 閱讀 1410

問題:

輸入乙個長度為n的序列a,找到乙個最長的連續子串行,使得該序列中沒有重複的元素。

分析:

假設序列元素從0編號,所求子串行的左端索引為l,右端索引為r。首先,l和r從0開始。

①判斷a[r]是否在子串行中,如果不在子串行中,r增大;如果在子串行中,r無法增大。

②求連續子串行最大長度。

③l向右增大一,重複①②,直到r超出序列a的範圍。

set集儲存a[l-r] 中的元素,r+1,把元素插入到set集中;l+1,從set集中刪除元素。

**如下:

#include #include using namespace std;

const int maxn = 100;

int a[maxn];

int main()

printf("連續子串行長度:%d",ans);

return 0;

}

map求出last[i],即a[i] 的上乙個相同元素的下標。當上乙個相同元素的下標不在l-r的區間,可以增大r。

**如下:

#include #include using namespace std;

const int maxn = 100;

int a[maxn], last[maxn];

mapcur;

int main()

int l = 0, r = 0, ans = 0;

while(r < n){

while(r < n && last[r]測試結果:

uva 11572 唯一的雪花 (滑動視窗)

題意 輸入乙個長度為n n 10 6 的序列a,找乙個盡量長的連續子串行a l a r 使得序列中沒有相同的元素。這道題要用滑動視窗的思想,右端點一直擴充套件直至右端點元素與視窗內元素重複時,刪除左端點元素直至右端點元素與視窗內元素不相同。找到視窗內元素最多時就是最長連續子串行。map實現 incl...

UVA 11572 唯一的雪花 滑動視窗

這道題採用滑動視窗的做法 set o n 首先l和r都指向a 0 這時我們擴充套件r,直到r擴充套件不了,我們擴充套件l,怎麼判斷r擴充套件不了了呢,可以用乙個set,把擴充套件過的元素全部insert到set裡,當a r 1 的元素已經在set裡出現過或者a r 已經是最後乙個元素,我們就不能再擴...

唯一的雪花(UVa 11572)

map容器解法 使用hash map 輸入乙個長度為n n 106 的序列a,找到乙個盡量長的連續子串行a l ar,使得該序列中沒有相同的元素。set解法 因為序列中沒有相同的元素,比較容易想到用乙個stl中的set,儲存a l r 中元素的組合。當r增大時判斷a r 1 是否在set 現,如果不...