2483. 商店的最少代价
题目描述
给你一个顾客访问商店的日志,用一个下标从 0 开始且只包含字符 'N' 和 'Y' 的字符串 customers 表示:
- 如果第
i个字符是'Y',它表示第i小时有顾客到达。 - 如果第
i个字符是'N',它表示第i小时没有顾客到达。
如果商店在第 j 小时关门(0 <= j <= n),代价按如下方式计算:
- 在开门期间,如果某一个小时没有顾客到达,代价增加
1。 - 在关门期间,如果某一个小时有顾客到达,代价增加
1。
请你返回在确保代价 最小 的前提下,商店的 最早 关门时间。
注意,商店在第 j 小时关门表示在第 j 小时以及之后商店处于关门状态。
示例 1:
输入:customers = "YYNY" 输出:2 解释: - 第 0 小时关门,总共 1+1+0+1 = 3 代价。 - 第 1 小时关门,总共 0+1+0+1 = 2 代价。 - 第 2 小时关门,总共 0+0+0+1 = 1 代价。 - 第 3 小时关门,总共 0+0+1+1 = 2 代价。 - 第 4 小时关门,总共 0+0+1+0 = 1 代价。 在第 2 或第 4 小时关门代价都最小。由于第 2 小时更早,所以最优关门时间是 2 。
示例 2:
输入:customers = "NNNNN" 输出:0 解释:最优关门时间是 0 ,因为自始至终没有顾客到达。
示例 3:
输入:customers = "YYYY" 输出:4 解释:最优关门时间是 4 ,因为每一小时均有顾客到达。
提示:
1 <= customers.length <= 105customers只包含字符'Y'和'N'。
解法
方法一:枚举
如果商店在第 \(0\) 小时关门,那么代价为 \(\textit{customers}\) 中字符 'Y' 的数量,我们初始化答案变量 \(\textit{ans}\) 为 \(0\),代价变量 \(\textit{cost}\) 为 \(\textit{customers}\) 中字符 'Y' 的数量。
接下来,我们枚举商店在第 \(j\) 小时关门(\(1 \leq j \leq n\))。如果 \(\textit{customers}[j - 1]\) 为 'N',说明在开门期间没有顾客到达,代价增加 \(1\);否则说明在关门期间有顾客到达,代价减少 \(1\)。如果当前代价 \(\textit{cost}\) 小于最小代价 \(\textit{mn}\),我们将答案变量 \(\textit{ans}\) 更新为 \(j\),并将最小代价 \(\textit{mn}\) 更新为当前代价 \(\textit{cost}\)。
遍历结束后,返回答案变量 \(\textit{ans}\) 即可。
时间复杂度 \(O(n)\),其中 \(n\) 为字符串 \(\textit{customers}\) 的长度。空间复杂度 \(O(1)\)。
1 2 3 4 5 6 7 8 9 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | |