PAT_1054 The Dominant Color (20 分) 寻找众数

本文介绍了使用map统计和排序两种方法快速找出图像中主导颜色的算法,针对600x800大小的图像数据,避免了内存溢出,通过统计颜色出现次数找到超过半数的dominantcolor,展示了两种高效解决方案。
摘要由CSDN通过智能技术生成

题目链接
在这里插入图片描述

题目也就是 2 24 2^{24} 224看起来很吓人,其实这个数字无非是16 777 216,连int都没超,而且根据题意无非是最多600* 800个数字,每个数字最多600*800,但是开数组直接拿下标映射显然不行,所以选择用map统计即可,或者采用vector存储所有数字,因为dominant color出现半数以上,那么排序后最中间的那个数字也即是众数,因此也可以排完序获取中间数字(因为下标从0开始,所以取得数字是color.size()/2 )。

因为题目说了dominant color要超过半数,所以采用map统计时一种颜色出现半数以上的时候就可以终止循环了。
还有这里涉及最多600*800个输入,有人说用cin超时了,虽然我用cin没有超时,不过鉴于这里输入已经挺频繁了还是有意识地用scanf比较好。

采用map:

#include <iostream>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
    ll M,N;
    cin >> M >> N;
    unordered_map<ll ,ll> mp;
    ll res=0,ans=0;
    for(ll i=0;i<N;i++){
        for(ll j=0;j<M;j++){
            ll tmp;
            cin >> tmp;
            if(mp.count(tmp)==0){
                mp[tmp]=1;
            }else mp[tmp]++;
            if(mp[tmp]>res){
                res=mp[tmp];
                ans=tmp;
                if(res>M*N/2) break;//超出一半就不需要接着统计了
            }
        }

    }
    cout << ans;
    return 0;
}

·
·
·
采用排序

#include <iostream>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
    ll M,N;
    cin >> M >> N;
    vector<ll> color;
    for(ll i=0;i<N;i++){
        for(ll j=0;j<M;j++){
            ll tmp;
            scanf("%lld",&tmp);
            color.push_back(tmp);
        }
    }
    sort(color.begin(),color.end());
    cout << color[color.size()/2];
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值