給定一個已由小到大排序的整數陣列,如何高效找出重複出現次數最多的元素其出現幾次?本文提供一個直觀的解法:先去重取得不重複值陣列,再對每個唯一值計數,最後取最大計數。
輸入陣列 re_num[] = {1, 2, 2, 3, 3, 3, 4, 5, 5, 6}(已排序)。輸出最大重複次數(本例為 3,對應元素 3)。
num[] 存放去重後的唯一值(利用已排序特性,相鄰比較即可去重)。max 記錄最大計數。#include <stdio.h>
int main() {
int i, k, max = 0, j = 0, cout = 0;
int re_num[] = {1, 2, 2, 3, 3, 3, 4, 5, 5, 6};
int num[10];
// 去重:將不重複值存入 num[]
num[0] = re_num[0];
for (i = 0; i < 10; i++) {
if (num[j] != re_num[i]) num[++j] = re_num[i];
}
// 計算每個唯一值的出現次數並更新最大值
for (i = 0; i < j; i++) {
cout = 0;
for (k = 0; k < 10; k++) {
if (num[i] == re_num[k]) cout++;
if (max < cout) max = cout;
}
}
printf("該陣列中重複次數最多為 %d 次\n", max);
return 0;
}
輸出:該陣列中重複次數最多為 3 次
因陣列已排序,實際上只需單次遍歷即可計算連續相同元素的長度,時間複雜度可從 O(n²) 降為 O(n)。