【问题描述】已知一个整数序列A=(a0,a1,…,an−1),其中0<=ai<n/2(0<=i<n),若存在ap1=ap2=ap3=…=apm=x,且 m>n/2,则称x为A的主元素。 例如有A=(0,5,5,3,5,7,5,5),则5为主元素;又如A=(0,5,5,3,5,1,5,7),则A中没有主元素。 假设顺序表A中有n个元素,请设计算法,找出A的主元素,若存在主元素,则输出主元素;否则输出 A中没有主元素。 Suppose there are n elements in the table A, please design an algorithm to find out the main element of A. if there is a main element, output the main element; otherwise, output a without main element 【输入形式】每组数据有两行,第一行为一个整数n,代表数组中有n个元素。第二行为数组中的n 个元素(元素之 间用空格分隔)。 【输出形式】每组数据输出一行,若数组中存在主元素,输出主元素的值,若数组中不存在主元素,则输出A 中没 有主元素。
时间: 2023-04-05 14:01:20 浏览: 143
算法思路:
首先,我们可以使用哈希表来统计每个元素出现的次数,然后再遍历哈希表,找到出现次数大于 n/2 的元素即为主元素。但是,这种方法需要额外的空间来存储哈希表,空间复杂度为 O(n)。
另一种方法是使用摩尔投票法,该方法的空间复杂度为 O(1)。具体思路如下:
1. 初始化候选主元素为 A[0],计数器 count 为 1。
2. 遍历数组 A,如果 A[i] 等于候选主元素,则 count 加 1;否则,count 减 1。
3. 如果 count 减为 0,则重新选择候选主元素为 A[i],并将 count 设为 1。
4. 遍历完数组 A 后,候选主元素即为可能的主元素,再次遍历数组 A 统计该元素出现的次数,如果出现次数大于 n/2,则该元素为主元素;否则,数组 A 中不存在主元素。
算法实现:
C++ 代码如下:
阅读全文