举个例子
数组:[1, 5, 1, 8, 1, 2, 1, 1, 3, 1]
包含6个1,出现次数超过了半数5
1就是主元素
数组:[1, 5, 9, 8, 1, 2, 1, 1, 3, 1]
包含5个1,出现次数不超过半数5
没有主元素
主要逻辑包含两个要点
用字典把元素当作key,value存储出现的次数
但是有需要遍历所有的存储key,比较各自出现次数大小
key - 主元素,默认取数组第一个当作key
反正需要统计次数
则在首次遍历数组的过程中,就统计count
我们可以不用统计具体每个元素出现的次数,既然主元素的出现次数超过 一半
这种方式比之前的字典方式,省去了空间复杂度
void checkKeyElement(int array[], int n) {
int count = 0;
int key = array[0];
for (int i = 0; i < n; i++) {
if (array[i] == key) {
count++;
} else {
if (count > 0) {
count--;
} else {
key = array[i];
count = 1;
}
}
}
if (count < 1) {
printf("数组中不存在主元素\n");
return;
}
count = 0;
for (int i = 0; i < n; i++) {
if (array[i] == key) {
count++;
}
}
if (count <= n / 2) {
printf("数组中不存在主元素\n");
return;
}
printf("数组中存在主元素 %i\n", key);
}