排序算法笔记--摩尔投票算法

摩尔投票算法

摩尔投票算法是一种用于在数组中查找出现次数超过一半的元素的有效算法。算法的核心思想是利用候选元素和计数器进行投票,通过消除不同元素之间的抵消来找到出现次数超过一半的元素。

算法原理

如果数组中存在一个出现次数超过一半的元素,那么这个元素的剩余部分一定会抵消其他元素的出现次数,最终剩下的就是该元素。

算法步骤

  1. 初始化候选元素 candidate 为数组的第一个元素,计数器 count 为 1。
  2. 从数组的第二个元素开始遍历。
  3. 如果当前元素与候选元素相同,则将计数器 count 加 1。
  4. 如果当前元素与候选元素不同,则将计数器 count 减 1。
  5. 如果计数器 count 减为零,则更新候选元素为当前元素,并将计数器 count 重置为 1。
  6. 完成遍历后,候选元素就是出现次数超过一半的元素。

实例

例子:

假设数组为 2, 2, 1, 1, 1, 2, 2

  • 初始时,候选元素 candidate 为 2,计数器 count 为 1。
  • 开始遍历数组:
    • 遍历到 2,与候选元素相同,计数器 count 加 1,计数器变为 2。
    • 遍历到 1,与候选元素不同,计数器 count 减 1,计数器变为 1。
    • 遍历到 1,与候选元素不同,计数器 count 减 1,计数器变为 0。
    • 计数器 count 变为 0,更新候选元素为当前元素 1,计数器 count 重置为 1。
    • 遍历到 1,与候选元素相同,计数器 count 加 1,计数器变为 2。
    • 遍历到 2,与候选元素相同,计数器 count 加 1,计数器变为 1。
    • 遍历到 2,与候选元素相同,计数器 count 加 1,计数器变为 0。
    • 计数器count变为0,更新候选元素为当前元素2,计数器count重置为2

完成遍历后,候选元素为 2,它是出现次数超过一半的元素

解题模板

java 复制代码
class Solution {
    public int majorityElement(int[] nums) {
        int candidate = nums[0];
        int count = 1;
        
        for (int i = 1; i < nums.length; i++) {
            if (count == 0) {
                candidate = nums[i];
                count = 1;
            } else if (nums[i] == candidate) {
                count++;
            } else {
                count--;
            }
        }
        
        return candidate;
    }
}

题目:寻找发帖的水王

当水王发帖数大于一半时,直接使用模板进行解答:

java 复制代码
public class test1 {
    //出现次数大于一半
    public int  solve(int []arr){
        int candidate = arr[0];
        int count =1;
        for(int i =1;i<arr.length;i++){
            if(count == 0){
                candidate = arr[i];
                count =1;
            }else if(arr[i] == candidate){
                count++;
            }else{
                count--;
            }
        }
        return candidate;
    }
 }

题目变形:当水王发帖数刚好等于一半时,需要判断寻找元素是否是最后一位

java 复制代码
//寻找发帖水王 出现次数刚好是一半
    public static void solve1(int[] arr){
        int candidate = arr[0];
        int nTimes =0;
        int countOfLast = 0;
        int N = arr.length;
        for(int i =0;i<N;i++){
            if(arr[i] == arr[N-1]){
                countOfLast++;
            }
            if(nTimes ==0){
                candidate = arr[i];
                nTimes =1;
                continue;
            }
            if (arr[i] == candidate){
                nTimes++;
            }else{
                nTimes--;
            }
        }
        if(countOfLast == N/2){
            System.out.println(arr[N-1]);
        }else{
            System.out.println(candidate);
        }
    }
相关推荐
ysa05103031 分钟前
【板子】短序列dp(换成维护更小常数维度的dp)
c++·笔记·算法·板子
shwill12333 分钟前
PID 算法(三)--- 增量 PID ↔ 单神经元 PID 等价映射
linux·算法
wabs6662 小时前
关于图论【卡码网110.字符串迁移的思考】
数据结构·算法·图论
hanlin032 小时前
刷题笔记:力扣第242、349题(哈希表)
笔记·算法·leetcode
only-qi4 小时前
大模型Agent面试攻略:落地工程痛点、评估体系与Agentic RAG核心精讲
人工智能·算法·面试·职场和发展·langchain·rag
Gauss松鼠会5 小时前
【GaussDB】GaussDB锁阻塞源头查询
java·开发语言·前端·数据库·算法·gaussdb·经验总结
oier_Asad.Chen5 小时前
【洛谷题解/AcWing题解】洛谷P4011 孤岛营救问题/AcWing1131拯救大兵瑞恩
数据结构·笔记·学习·算法·动态规划·图论·宽度优先
逻辑君6 小时前
基于 A2C 算法的双足机器人行走控制
人工智能·深度学习·算法·机器学习·机器人
冻柠檬飞冰走茶6 小时前
PTA基础编程题目集 7-19 支票面额(C语言实现)
c语言·开发语言·数据结构·算法
船漏了就会沉6 小时前
状态压缩DP:小数据下的“暴力美学”
算法