📌  相关文章
📜  门| Sudo GATE 2020 Mock II(2019年1月10日)|问题17(1)

📅  最后修改于: 2023-12-03 15:42:19.752000             🧑  作者: Mango

门| Sudo GATE 2020 Mock II(2019年1月10日)|问题17

问题描述

给定一个二进制数组,元素为0或1,表示一排相邻的门,1表示门是打开的,0表示门是关闭的。当人通过某个门时,这个门会打开,如果该门已经打开,则它会再次关闭。任务是计算一个人可以通过所有门的最小步数。

示例

输入: [1, 0, 0, 1, 0, 1, 1, 1]

输出: 9

解决方案

我们可以用一个flag表示当前的门是否是打开的状态,最开始的门的状态为1(打开),然后遍历每个门,如果当前门的状态与flag相同,则说明需要进行一次开关,计数加1,同时更新flag的状态。代码实现如下:

def min_steps(arr):
    count = 0
    flag = 1
    for i in arr:
        if i != flag:
            count += 1
            flag = not flag
    return count

时间复杂度为O(n),因为需要遍历整个数组一遍。