LC每日一题|20240516 - 1953. 你可以工作的最大周数

87 阅读2分钟

LC每日一题|20240516 - 1953. 你可以工作的最大周数

给你 n 个项目,编号从 0n - 1 。同时给你一个整数数组 milestones ,其中每个 milestones[i] 表示第 i 个项目中的阶段任务数量。

你可以按下面两个规则参与项目中的工作:

  • 每周,你将会完成 某一个 项目中的 恰好一个 阶段任务。你每周都 必须 工作。
  • 连续的 两周中,你 不能 参与并完成同一个项目中的两个阶段任务。

一旦所有项目中的全部阶段任务都完成,或者仅剩余一个阶段任务都会导致你违反上面的规则,那么你将 停止工作 。注意,由于这些条件的限制,你可能无法完成所有阶段任务。

返回在不违反上面规则的情况下你 最多 能工作多少周。

提示:

  • n == milestones.length
  • 1 <= n <= 10^5
  • 1 <= milestones[i] <= 10^9

题目等级:Medium

难度分:1803.75

解题思路

非常简单的一道题~

假定某个项目编号A的任务数量是最多的,记 n ,那么为了满足题目要求「连续两周不能做同一件工作」的目标,在完成A的过程中需要依次穿插其他的工作,显然,满足要求的最小插入数量是n - 1。反过来说,如果我们需要在已经满足题目要求的 m 个任务中插入同一个项目的任务,最多能插入的数量应该是 m + 1 个。

这样我们可以遍历数组求和并找到任务数量最大的项目,然后算算其他任务的数量和是否大于 n - 1,如果满足,直接返回所有任务的数量和就可以了;如果不满足,根据上文思路返回一个 2m + 1 即可。

AC代码

class Solution {
    fun numberOfWeeks(milestones: IntArray): Long {
        var sum = 0L
        var max = 0
        for (i in milestones.indices) {
            sum += milestones[i]
            max = Math.max(milestones[i], max)
        }
        if (max * 2L > sum + 1L) return (sum - max.toLong()) * 2 + 1
        return sum
    }
}

时间复杂度:O(n)

空间复杂度:O(1)

碎碎念

长生不老从刷Leetcode开始XD

话说这题...给这个难度分是不是水了点...