文章

33

粉丝

253

获赞

1

访问

15.5k

头像
2013年计算机学科专业基础综合试题 - 第41题回答
数据结构
发布于2025年10月29日 16:05
阅读数 16

 

### (1)算法的基本设计思想  
主元素的核心特征是“出现次数超过序列长度的一半”,基于该特征可分两步设计高效算法,时间复杂度优化至 **O(n)**,空间复杂度 **O(1)**:  

1. **筛选候选主元素**:  
   遍历数组时维护两个变量——`candidate`(候选主元素)和`count`(候选元素的计数)。  
   - 初始时`count=0`,若`count=0`,则将当前数组元素设为新的`candidate`,并置`count=1`;  
   - 若当前元素与`candidate`相同,`count`加1;若不同,`count`减1。  
   原理:主元素出现次数超过一半,遍历后`candidate`必然是主元素(若存在)——非主元素会相互抵消计数,主元素的计数最终无法被完全抵消。  

2. **验证候选元素**:  
   由于第一步可能因“无主元素”得到错误候选(如序列`[1,2,3]`会得到`3`作为候选),需再次遍历数组,统计`candidate`的实际出现次数。若次数超过数组长度的一半,则为真正主元素;否则无主元素,返回`-1`。  


### (2)Java语言实现(关键步骤注释)  
```java
public class MainElementFinder {
    public static int findMainElement(int[] arr) {
        // 边界判断:空数组直接返回-1
        if (arr == null || arr.length == 0) {
            return -1;
        }

        // 第一步:筛选候选主元素
        int candidate = 0; // 候选主元素
        int count = 0;     // 候选元素的计数
        for (int num : arr) {
            if (count == 0) {
                // 计数为0时,更新候选元素
                candidate = num;
         ...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发