首页 > 其他分享 >Leetcode 169 -- 分治&&摩尔投票法

Leetcode 169 -- 分治&&摩尔投票法

时间:2022-10-21 12:57:08浏览次数:76  
标签:count candidate nums -- int 169 && 阵营 maj

题目描述

Majority Element


思路

分治法参考官方题解

其实这里的分治算法和归并排序很相像。


摩尔投票算法(同归于尽消杀法)

如果我们把出现次数大于数据长度一半的数记为 \(+1\),把其他数记为 \(−1\),将它们全部加起来,显然和大于 \(0\)。

证明

“同归于尽消杀法” :
由于多数超过50%, 比如100个数,那么多数至少51个,剩下少数是49个。

  1. 遍历数组
  2. 第一个到来的士兵,直接插上自己阵营的旗帜占领这块高地,此时领主 winner 就是这个阵营的人,现存兵力 count = 1。
  3. 如果新来的士兵和前一个士兵是同一阵营,则集合起来占领高地,领主不变,winner 依然是当前这个士兵所属阵营,现存兵力 count 加一;
  4. 如果新来到的士兵不是同一阵营,则前方阵营派一个士兵和它同归于尽。 此时前方阵营兵力-1, 即使双方都死光,这块高地的旗帜 winner 不变,没有可以去换上自己的新旗帜。
  5. 当下一个士兵到来,发现前方阵营已经没有兵力,新士兵就成了领主,winner 变成这个士兵所属阵营的旗帜,现存兵力 count ++。

就这样各路军阀一直厮杀以一敌一同归于尽的方式下去,直到少数阵营都死光,剩下几个必然属于多数阵营的,winner 是多数阵营。

(多数阵营 51个,少数阵营只有49个,死剩下的2个就是多数阵营的人)

投票算法证明:
如果候选人不是 maj ,则 maj 会和其他非候选人一起反对,所以候选人一定会下台(maj==0时发生换届选举)
如果候选人是 maj , 则 maj 会支持自己,其他候选人会反对,同样因为 maj 票数超过一半,所以maj 一定会成功当选


代码-分治

class Solution {
public:
    int get_range(vector<int> &nums, int l, int r, int target)
    {
        int cnt = 0;
        for(int i = l; i <= r; i ++ )
            if(nums[i] == target)   cnt ++ ;
        return cnt;
    }
    int merge(vector<int> &nums, int l, int r)
    {
        if(l == r)  return nums[l];
        int mid = l + r >> 1;
        int left_candidate  = merge(nums, l, mid);
        int right_candidate = merge(nums, mid + 1, r);
        if(left_candidate != right_candidate)
        {
            if(get_range(nums, mid + 1, r, right_candidate) >= get_range(nums, l, mid, left_candidate))
                return right_candidate;
        }   
        return left_candidate;
    }
    int majorityElement(vector<int>& nums) {
        return merge(nums, 0, nums.size() - 1);
    }
};

代码--摩尔投票

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        int candidate = -1, count = 0;
        for(auto &x : nums) {
            if(count == 0) {
                candidate = x;
                count = 1;
            }
            else {
                count += (x == candidate ? 1 : -1);
            }
        }

        return candidate;
    }
};

众数

众数指的是一组数据当中出现次数最多的数,若数据的数据值出现次数相同且无其他数据值时,则不存在众数。
例如 \([1, 2, 2, 1]\) 就不存在众数。

标签:count,candidate,nums,--,int,169,&&,阵营,maj
From: https://www.cnblogs.com/ALaterStart/p/16813085.html

相关文章

  • firewalld
    打开防火墙firewalldsystemctlstartfirewalld列出所有开发端口、服务firewall-cmd--list-all永久开放某tcp端口firewall-cmd--zone=public--add-port=445/tcp......
  • file-server
    packagemainimport(   "bufio"   "encoding/binary"   "fmt"   "net"   "os"   "unsafe")funcSHandleError(errerror,whenstring) {  ......
  • nfs 防火墙firewalld 开放
    yum-yinstallnfs-utilsrpcbind#安装nfs,nfs依赖rpc工作systemctlstartrpcbind#开启rpc再开启nfs服务systemctlstartnfssystemctlenablerpcbind#设置......
  • Git极简教程(3)--branch级别的操作,合并分支
    Git极简教程(3)--branch级别的操作origin也有一个默认叫master的branch。默认主分支origin/mastergitpull这个命令是更新origin(比如朋友提交了新的改动,需要同步),然后把......
  • 爬取起点小说信息存入excel
    点击查看代码importurllib.requestfromlxmlimportetreeimportxlwt#请求地址url='https://www.qidian.com/all/action1-page1'#用户代理headers={......
  • Cross-Origin Read Blocking (CORB) blocked cross-origin response(关于jsonp的正确
    参考一:https://blog.csdn.net/weixin_34306446/article/details/91897992?spm=1001.2101.3001.6650.4&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7E......
  • github 访问不了 - 访问 github,修改 hosts 文件方法
    github访问不了-访问github,修改hosts文件方法 一、访问github,修改hosts文件方法(修改hosts文件保存之后需要刷新DNS,在CMD窗口输入:ipconfig/flushdns);访......
  • 实验6:开源控制器实践——RYU
    实验6:开源控制器实践——RYU一、实验目的1.能够独立部署RYU控制器;2.能够理解RYU控制器实现软件定义的集线器原理;3.能够理解RYU控制器实现软件定义的交换机原理。二、......
  • spring导入excel
    springboot导入excel引入pom依赖<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.13</version></dependency>......
  • java 批量插入
    1.在Mapper中/***批量添加实体*@paramequmentEntityList*/voidaddBatch(@Param("equmentEntityList")List<EqumentEntity>equmentEntityL......