LC每日一题|20240516 - 1953. 你可以工作的最大周数
给你
n个项目,编号从0到n - 1。同时给你一个整数数组milestones,其中每个milestones[i]表示第i个项目中的阶段任务数量。你可以按下面两个规则参与项目中的工作:
- 每周,你将会完成 某一个 项目中的 恰好一个 阶段任务。你每周都 必须 工作。
- 在 连续的 两周中,你 不能 参与并完成同一个项目中的两个阶段任务。
一旦所有项目中的全部阶段任务都完成,或者仅剩余一个阶段任务都会导致你违反上面的规则,那么你将 停止工作 。注意,由于这些条件的限制,你可能无法完成所有阶段任务。
返回在不违反上面规则的情况下你 最多 能工作多少周。
提示:
n == milestones.length1 <= n <= 10^51 <= 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
话说这题...给这个难度分是不是水了点...