zoukankan      html  css  js  c++  java
  • [P2397] yyy loves Maths VI (mode)

    Link:

    P2397 传送门

    Solution:

    (1)在这里记录一个小小的黑科技:摩尔投票法

    (线性时间复杂度,$O(1)$的空间复杂度求众数

    从数组的第一个元素开始,假定它代表的群体的人数是最多的

    设置一个计数器,在遍历时遇到不同于这个群体的人时就将计数器-1,遇到同个群体的人时就+1

    只要在计数器归0时就重新假定当前元素代表的群体为人数最多的群体再继续遍历

    那么到了最后,计数器记录的那个群体必定是人最多的那个群体

    其实就是抵消的思想嘛,记录当前有可能为众数的数,思想还是不错的
     
     
    (2)这题还有一个挺妙的算法:记录二进制中每一位出现的次数,最后累加出现次数超过$n/2$的数位
    将原数的(个数)关系转化到每一位,好像还挺常用的?

    Code:

    #include <bits/stdc++.h>
    
    using namespace std;
    
    int main()
    {
        int n,x,cur=0,cnt=0;
        scanf("%d",&n);
        while(n--)
        {
            scanf("%d",&x);
            if(!cnt) cnt++,cur=x;
            else if(x!=cur) cnt--;
            else cnt++; 
        }
        printf("%d",cur);
        return 0;
    }
    摩尔投票法
    #include <bits/stdc++.h>
    
    using namespace std;
    int n,x,cnt[35],res;
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&x);
            for(int dgt=0;x;x>>=1,dgt++)
                if(x&1) cnt[dgt]++;
        }
        for(int i=30;i>=0;i--)
            if(cnt[i]>n/2) res+=(1<<i);
        printf("%d",res);
        return 0;
    }
    位运算法
  • 相关阅读:
    Java序列化原理
    分库分表
    数据库索引
    监听TCP端口号:从简单Socket到NIO到Netty
    如何保证缓存与数据库的双写一致性
    代理模式:静态代理、JDK动态代理、Cglib动态代理
    Redis发布订阅(Pub-Sub)模式
    Redis分片机制(Sharding)
    Redis高可用性:主从、哨兵和集群
    Redis简介
  • 原文地址:https://www.cnblogs.com/newera/p/9285690.html
Copyright © 2011-2022 走看看