当前位置: 首页 > news >正文

JZ39 数组中出现次数超过一半的数字 (Boyer-Moore 投票算法)候选法

数组中出现次数超过一半的数字_牛客题霸_牛客网

描述

给一个长度为 n 的数组,数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。

例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。

数据范围:n≤50000n≤50000,数组中元素的值 0≤val≤100000≤val≤10000

要求:空间复杂度:O(1)O(1),时间复杂度 O(n)O(n)

输入描述:

保证数组输入非空,且保证有解

示例1

输入:

[1,2,3,2,2,2,5,4,2]
返回值:
2

示例2

输入:

[3,3,3,3,2,2,2]
返回值:
3

示例3

输入:

[1]
返回值:
1

哈希

class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> numbers) {
        map<int, int> mp;
        int n = numbers.size();
        for(auto e : numbers)
        {
            mp[e]++;
            if(mp[e] > n/2)
                return e;
        }
        return 0;
    }
};

排序

class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> numbers) {
        sort(numbers.begin(), numbers.end());
        return numbers[numbers.size() / 2];
    }
};

 (Boyer-Moore 投票算法)

想象一下,如果把这些数字当做人种,一个数字和另外一个数字打了起来,同归于尽。最后剩下的是不是人数最多的那种人。这里要满足一个条件:某类人的数目一定要大于总人数的一半。

算法步骤:我们选择输入数组中第一个元素作为候选元素candidate,并设置其出现次数为count=1。随后遍历数组。当遇到与candidate相同的元素,count+1;不同的元素,count-1。当count为0的时候,选择下一个元素为候选元素,并且置count=1。遍历到数组的最后,剩下的candidate就是要求的结果。

class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int>& numbers) {
        int candidate = numbers[0];
        int count = 1;
        for(int i = 1; i < numbers.size(); i++)
        {
            if(numbers[i] == candidate)
                count++;
            else
                count--;
            if(count == 0)
            {
                candidate = numbers[i+1];
            }
        }
        return candidate;
    }
};

相关文章:

  • 浮点数的机器码表示
  • linux--关于makefile
  • 白话文实战OpenFeign
  • 基于opencv的 24色卡IQA评测算法源码-可完全替代Imatest
  • SpringBoot 集成 Caffeine 实现本地缓存
  • WPF创建自定义类和控件及打包成dll引用
  • 2.10 Playground Chat提示工程实战:从交互调试到企业级应用的全链路指南
  • 驱动开发、移植(最后的说法有误,以后会修正)
  • 【Apache Paimon】-- 16 -- 利用 paimon-flink-action 同步 kafka 数据到 hive paimon 表中
  • Linux环境下安装mkcert
  • Python--正则表达式
  • SAP-ABAP:SAP中REPORT程序和online程序的区别对比
  • Modbus通讯协议
  • YOLOv5-Seg 完全指南:从训练到后处理
  • 阅读论文笔记《Efficient Estimation of Word Representations in Vector Space》
  • YOLOV8的学习记录(二) yolo8的几个内置模型简介
  • RabbitMQ介绍以及基本使用
  • 小米平板怎么和电脑共享屏幕
  • c++--静态联编--动态联编
  • 动态库与静态库:深入解析与应用
  • 第1现场 | 印巴冲突:印50多年来首次举行大规模民防演习
  • 以军总参谋长:已进入“决定性打击计划的第二阶段”
  • 江淮、极氪、奇瑞,排着队造“劳斯莱斯”
  • 习近平在俄罗斯媒体发表署名文章
  • “子宫内膜异位症”相关论文男性患者样本超六成?福建省人民医院展开调查
  • 什么让翻拍“语文”成为短视频新风潮