阿里编程测试-问答题1-阿里有很多三位一体……

ACM模版

描述

题解

这个题有强调要求在线性时间和空间复杂度完成,所以排序后遍历是行不通的。

我们可以先扫一遍数组,记录下来 max_ m a x _ min_ m i n _ ,这样显然答案大于 max_min_n1 m a x _ − m i n _ n − 1 ,这样我们可以将数的范围拆分为若干段,每段长度为 max_min_n1 m a x _ − m i n _ n − 1 ,遍历一遍序列,将元素分到对应的段,然后每个段记录对应的 min_ m i n _ max_ m a x _ ,这样答案就是上一个块的 max_ m a x _ 与下一个块的 min_ m i n _ 的差值的最大值。

这里一定要注意,分段分的是数的范围,而不是数组序列,并且 ans a n s 初始化为 max_min_n1 m a x _ − m i n _ n − 1

代码

#include <cstdio>
#include <algorithm>

using namespace std;

const int INF = 0x3f3f3f3f;
const int MAXN = 1e7 + 7;

int a[MAXN];
int maxVal[MAXN];
int minVal[MAXN];

int main()
{
    int t, cnt = 0;;
    while (~scanf("%d", &t))
    {
        a[cnt++] = t;
        getchar();
    }

    int min_ = INF, max_ = -1;
    for (int i = 0; i < cnt; ++i)
    {
        min_ = min(min_, a[i]);
        max_ = max(max_, a[i]);
        maxVal[i] = -1;
        minVal[i] = INF;
    }

    t = (max_ - min_) / (cnt - 1);
    if ((max_ - min_) % (cnt - 1) != 0)
    {
        ++t;
    }
    for (int i = 0; i < cnt; ++i)
    {
        int id = (a[i] - min_) / t;
        minVal[id] = min(minVal[id], a[i]);
        maxVal[id] = max(maxVal[id], a[i]);
    }

    int ans = (max_ - min_) / (cnt - 1);
    max_ = -1;
    min_ = -1;
    for (int i = 0; i < cnt; ++i)
    {
        if (maxVal[i] == -1)
        {
            continue;
        }

        min_ = minVal[i];
        if (max_ != -1)
        {
            ans = max(ans, min_ - max_);
        }
        max_ = maxVal[i];
    }

    printf("%d\n",ans);

    return 0;
}
全部评论

相关推荐

铁锈不腻玩家:下面那个袁先生删了,问他怎么回事,头像都换不明白
点赞 评论 收藏
分享
耀孝女:就是你排序挂了
点赞 评论 收藏
分享
评论
点赞
收藏
分享
正在热议
# 25届秋招总结 #
442405次浏览 4511人参与
# 春招别灰心,我们一人来一句鼓励 #
41942次浏览 531人参与
# 阿里云管培生offer #
120248次浏览 2220人参与
# 地方国企笔面经互助 #
7962次浏览 18人参与
# 同bg的你秋招战况如何? #
76670次浏览 561人参与
# 虾皮求职进展汇总 #
115613次浏览 886人参与
# 北方华创开奖 #
107433次浏览 599人参与
# 实习,投递多份简历没人回复怎么办 #
2454658次浏览 34857人参与
# 实习必须要去大厂吗? #
55771次浏览 961人参与
# 提前批简历挂麻了怎么办 #
149901次浏览 1977人参与
# 投递实习岗位前的准备 #
1195935次浏览 18548人参与
# 你投递的公司有几家约面了? #
33206次浏览 188人参与
# 双非本科求职如何逆袭 #
662208次浏览 7394人参与
# 如果公司给你放一天假,你会怎么度过? #
4753次浏览 55人参与
# 机械人春招想让哪家公司来捞你? #
157628次浏览 2267人参与
# 如果你有一天可以担任公司的CEO,你会做哪三件事? #
11561次浏览 287人参与
# 发工资后,你做的第一件事是什么 #
12704次浏览 62人参与
# 工作中,努力重要还是选择重要? #
35804次浏览 384人参与
# 参加完秋招的机械人,还参加春招吗? #
20126次浏览 240人参与
# 我的上岸简历长这样 #
452016次浏览 8088人参与
# 实习想申请秋招offer,能不能argue薪资 #
39299次浏览 314人参与
# 非技术岗是怎么找实习的 #
155868次浏览 2120人参与
牛客网
牛客企业服务