設一個陣列記錄每一次輸入值的位置
再設一個基準值在每一次重複後,更新為前面重複值的後一位,亦即陣列記錄值加一
基準值存在意義為,每一次重複後,前面重複值以前的數均不考慮
故新輸入值所對應的陣列值需大於等於基準值,才能算重複
而每一次重複後都要計算當前的長度,記錄在ans陣列
另外,必須考慮沒有重複的情況,以count紀錄
而每一次重複後,count的值也會更新
#include <stdio.h>
#define MAX 1000005
int main(int argc, const char * argv[]) {
int case_number, n, test;
while (scanf("%d", &case_number) != EOF) {
while (case_number--) {
int i, j = 0;
int left = 1, count = 0, table[MAX] = {0}, ans[MAX] = {0}, result = 0;
/*left紀錄基準線,count計算不重複的情況,
table是對照表,ans是每一次的答案,result取最大的ans值*/
scanf("%d", &n);
for (i = 1; i <= n; i++) {
scanf("%d", &test);
if (table[test] >= left){ //大於等於不重複的基準線,即重複
ans[j++] = i - left; //紀錄答案
left = table[test] + 1; //調整基準線
count = i - table[test]; //記錄之後連續狀況的count亦要重新計算
}
else
count++; // 沒重複 直接加
table[test] = i; //更新table的值
}
if (count) //這個情況紀錄的是 從上一次重複(或不曾重複)到結束都沒有重複
ans[j] = count;
for (i = 0; ans[i]; i++) { //找最大
if (ans[i] > result)
result = ans[i];
}
printf("%d\n", result);
}
}
return 0;
}
沒有留言:
張貼留言