求众数~~

O(nlogn)的时间复杂度

emmmmm......

#include <bits/stdc++.h>
using namespace std;
#define vi vector<int>
#define sz(x) (int)x.size()
const int N=1e6 + 10;

int n, s[N];
int mx, mx_num;

void f(int l, int r)
{
    if (r-l+1<=mx_num||l==r)return; // 长度小于等于mx_num或者只有一个元素,结束
    int val=s[l];// 选择基准值
    int ll=l,rr=r;// 指向两个端点
    while(ll!=rr)// 类似快排
    {
        while (ll!=rr&&s[rr]>val)rr--; // 右指针向左移动,找到一个小于或等于基准值的元素
        s[ll]=s[rr];// 放到左指针

        while(ll!=rr&&s[ll]<=val)ll++;// 左指针向右移动,找到一个大于基准值的元素
        s[rr] = s[ll]; // 放到右指针
    }
    s[ll]=val;// 把基准值放到ll的位置
    int num=0;
    for (int i=l;i<=r;i++)
        if(s[i]==val)num++; //计数

    if (mx_num<num){ // 如果当前基准值的出现次数超过之前记录的最大次数,更新最大次数及对应元素
        mx_num=num;
        mx=val;
    }
    f(l, ll - 1);// 处理左边的子区间
    f(rr + 1, r);// 处理右边的子区间
}

void solve()
{
    cin>>n;
    for(int i=1;i<=n;i++)cin>>s[i];
    f(1,n);
    cout<<mx<<" "<<mx_num;
}

int main()
{
    ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
    solve();
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值