目录

2753:计算一个环形街道上的房屋数量 II(★★)

力扣第 2753 题

题目

给定一个代表 环形 街道的类 Street 的对象 street 和一个正整数 k,表示街道上房屋的最大数量(也就是说房屋数量不超过 k)。每个房屋的门初始时可以是开着的也可以是关着的(至少有一个房屋的门是开着的)。

刚开始,你站在一座房子的门前。你的任务是计算街道上的房屋数量。

Street 类包含以下函数:

  • void closeDoor():关闭当前房屋的门。
  • boolean isDoorOpen():如果当前房屋的门是开着的返回 true,否则返回 false
  • void moveRight():向右移动到下一座房屋。

注意: 环形 街道内,如果将房屋从 1n 编号,则当 i < nhousei 右边的房子是 housei+1housen 右边的房子是 house1

返回 ans,它表示街道上的房屋数量。

示例 1:

输入:street = [1,1,1,1], k = 10
输出:4
解释:街道上有 4 座房屋,它们的门都是开着的。
房屋数量小于 k,即 10。

示例 2:

输入:street = [1,0,1,1,0], k = 5
输出:5
解释:街道上有 5 座房屋,向右移动时第 1、3 和 4 座房屋的门是开着的,其余的门都是关着的。
房屋数量等于 k,即 5。

提示:

  • n 是房屋数量
  • 1 <= n <= k <= 105
  • street 是环形的
  • 输入数据中至少有一扇门是开着的

分析

  • 先找到一扇开着的门,不关
  • 然后边移动边关闭开着的门
  • 最后关门的时间即是刚好走了一圈

解答

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
class Solution:
    def houseCount(self, street: Optional['Street'], k: int) -> int:
        while not street.isDoorOpen():
            street.moveRight()
        res = 0
        for i in range(1,k+1):
            street.moveRight()
            if street.isDoorOpen():
                res = i
                street.closeDoor()
        return res

1230 ms