主元素问题
曾经在啊哈算法看到的问题, 这里的解法有很多, 根据实际需要来就行
常规做法:
桶存, 排序 等等都可以
最优解:
由于主元素的出现的次数超过 n / 2,那么在不断的消掉两个不同的元素之后,最后一定剩下主元素。
输入时判断与上一次保存的输入是否相同,如不同则删除两数, 可以用栈实现:
while (n--) {
scanf("%d", &a);
q[top++] = a;
top = (top > 1 && (q[top - 1] != q[top - 2])) ? (top - 2) : top;
}
printf("%d", q[top - 1]);
优化空间复杂度:
int val = -1, cnt = 0;
while (n--) {
scanf("%d", &a);
if (a != val) {
if (--cnt <= 0) {
val = a, cnt = 1;
}
} else {
++cnt;
}
}