文章
33
粉丝
253
获赞
1
访问
15.5k
### (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;
...
登录后发布评论
暂无评论,来抢沙发