map容器解法
使用hash_map
輸入乙個長度為n(n<=106)的序列a,找到乙個盡量長的連續子串行aset解法l–ar,使得該序列中沒有相同的元素。
因為序列中沒有相同的元素,比較容易想到用乙個stl中的set,儲存a[l~r]中元素的組合。
當r增大時判斷a[r+1]是否在set**現,如果不重複,此時要把a[r+1]插入set中
如果重複,移動l,在l+1時,要把a[l]從set中刪除。直到a[r+1]的值不重複。再插入a[r+1]。
因為set的插入和刪除都是o(logn)的,因此這演算法的複雜度為o(nlogn)。
//stl set別忘啦標頭檔案
#include
using
namespace std;
const
int maxn =
1000000+5
;int a[maxn]
;set <
int> s;
intmain()
s.erase
(a[l]);
l++; ans =
max(ans, r - l);}
cout << ans+
1<
// 因為序列從0開始排號,一定注意!輸出為ans+1
}return0;
}map容器解法
// uva11572 unique snowflakes
// rujia liu
// 演算法二:記錄位置i的上個相同元素位置last[i]
#include
#include
using
namespace std;
const
int maxn =
1000000+5
;int a[maxn]
, last[maxn]
;map<
int,
int> cur;
intmain()
int l =
0, r =
0, ans =0;
while
(r < n)
printf
("%d\n"
, ans);}
return0;
}
使用hash_map// uva11572 unique snowflakes
// rujia liu
// 演算法二:記錄位置i的上個相同元素位置last[i]。使用hash_map(gcc擴充套件)
#include
#include
using
namespace std;
using
namespace __gnu_cxx;
// hash_map
const
int maxn =
1000000+5
;int a[maxn]
, last[maxn]
;hash_map<
int,
int> cur;
intmain()
int l =
0, r =
0, ans =0;
while
(r < n)
printf
("%d\n"
, ans);}
return0;
}
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 唯一的雪花(滑動視窗)
問題 輸入乙個長度為n的序列a,找到乙個最長的連續子串行,使得該序列中沒有重複的元素。分析 假設序列元素從0編號,所求子串行的左端索引為l,右端索引為r。首先,l和r從0開始。判斷a r 是否在子串行中,如果不在子串行中,r增大 如果在子串行中,r無法增大。求連續子串行最大長度。l向右增大一,重複 ...