設一個陣列記錄每一次輸入值的位置
再設一個基準值在每一次重複後,更新為前面重複值的後一位,亦即陣列記錄值加一
基準值存在意義為,每一次重複後,前面重複值以前的數均不考慮
故新輸入值所對應的陣列值需大於等於基準值,才能算重複
而每一次重複後都要計算當前的長度,記錄在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; }
沒有留言:
張貼留言