Leetcode1953. 你可以工作的最大周数

Every day a Leetcode

题目来源:1953. 你可以工作的最大周数

类似题目:621. 任务调度器

解法1:贪心

本质上来说,我们需要构造一个尽量长的,相邻元素不同的序列,且元素 x 的出现次数不能超过 milestones[x]。

设 milestones 的元素和为 s,这是序列长度的上界。设 mx=max⁡(milestones),我们可以把该任务的阶段任务每次间隔 1 位排列在序列中,其他的任务则安排在空位上,这样的构造方法能保证序列最长。

如果 mx 特别大,大到它比其它元素的个数之和加 1 还要大,即 mx > s - mx + 1,那么说明 mx 这个任务不能全部完成,它只能安排 s - mx + 1 个阶段任务,此时能完成的阶段任务数为 (s - mx) + (s - mx + 1) = 2 * (s - mx) + 1;否则,所有任务都能全部完成,能完成的阶段任务数为 s。

代码:

/*
 * @lc app=leetcode.cn id=1953 lang=cpp
 *
 * [1953] 你可以工作的最大周数
 */

// @lc code=start
class Solution
{
public:
    long long numberOfWeeks(vector<int> &milestones)
    {
        long long s = accumulate(milestones.begin(), milestones.end(), 0LL);
        long long mx = *max_element(milestones.begin(), milestones.end());
        return mx > s - mx + 1 ? 2 * (s - mx) + 1 : s;
    }
};
// @lc code=end

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(n),其中 n 是数组 milestones 的长度。

空间复杂度:O(1)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值