HDU 2756-HOJ-Unique Snowflakes
2017-03-27 21:16
204 查看
题目大意:
给定一串长度为N的数字串,找出最长的不重复连续子序列解题思路:
这道题刚开始的时候可能会想到用遍历的方式来判断是否重复,但是这样做的时间复杂度比较高。所以我们可以采用 滑窗 的方法来求解。滑窗:
取left,right 记录当前序列的左右界限,开始向右遍历(right++),如果发现遍历到的数字是重复的,就把left右移一位(left++),直到没有重复。重复该过程直到right==N。(本题用一个数组来保存每个数字出现的个数,由于数据过大,用map保存)
程序代码:
#include <map> #include <stdio.h> using namespace std; const int MAX = 7 + 1000000; int dig[MAX]; int main() { int tc=0; //总次数 int ic=0; scanf("%d",&tc); while(++ic<=tc){ int n; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&dig[i]); int l=1,ans=1; map<int,bool> M; //数据过大,数组无法保存 M[dig[1]]=true; //M数组记录dig中元素是否出现过 for(int i=2;i<=n;i++){ while(M[dig[i]]) M[dig[l++]]=false; //如果出现过,left就右移一位 ans=max(ans,i-l+1); //取最长 M[dig[i]]=true; //标记为出现过 } printf("%d\n",ans); } }
考虑到left一直不断右移,该算法的时间复杂度平均下来为O(n).
相关文章推荐
- HDU 2756 Unique Snowflakes
- 解题报告 之 UVA11572 Unique Snowflakes
- UVA 11572(p239)----Unique snowflakes
- UVa--11572 Unique Snowflakes(尺取法)
- UVa 11572 - Unique Snowflakes (滑动窗口STL_map||set) 好题!!!
- UVA 11572 - Unique Snowflakes
- UVA - 11572 Unique Snowflakes 滑动窗口
- Uva11572 Unique Snowflakes【滑动窗口】【例题8-7】
- uva 11572 unique snowflakes——yhx
- uva 11572 Unique Snowflakes (唯一的雪花)
- XTU1004 Unique Snowflakes
- BNU19990 UVA11572 Unique Snowflakes
- UVA - 11572 Unique Snowflakes
- uva 11572 - Unique Snowflakes(与书上方法略有不同)
- Unique Snowflakes 详细题解
- UVA 11572 Unique Snowflakes(滑窗|双指针)
- [UVA11572]Unique Snowflakes[构造]
- UVA11572 Unique Snowflakes(滑窗)
- uva 11572 ——Unique Snowflakes
- uva 11572 unique snowflakes——yhx