执行结果:通过
题目 2274 不含特殊楼层的最大连续楼层数
Alice 管理着一家公司,并租用大楼的部分楼层作为办公空间。Alice 决定将一些楼层作为 特殊楼层 ,仅用于放松。
给你两个整数 bottom
和 top
,表示 Alice 租用了从 bottom
到 top
(含 bottom
和 top
在内)的所有楼层。另给你一个整数数组 special
,其中 special[i]
表示 Alice 指定用于放松的特殊楼层。
返回不含特殊楼层的 最大 连续楼层数。
示例 1:
输入:bottom = 2, top = 9, special = [4,6] 输出:3 解释:下面列出的是不含特殊楼层的连续楼层范围: - (2, 3) ,楼层数为 2 。 - (5, 5) ,楼层数为 1 。 - (7, 9) ,楼层数为 3 。 因此,返回最大连续楼层数 3 。
示例 2:
输入:bottom = 6, top = 8, special = [7,6,8] 输出:0 解释:每层楼都被规划为特殊楼层,所以返回 0 。
提示
1 <= special.length <= 105
1 <= bottom <= special[i] <= top <= 109
special
中的所有值 互不相同
代码以及解题思路
代码
class Solution:def maxConsecutive(self, bottom: int, top: int, special: List[int]) -> int:return max(y - x for x, y in pairwise([bottom - 1] + sorted(special) + [top + 1])) - 1
解题思路
- 理解题意:
bottom
和top
定义了查找连续整数序列的范围。special
列表包含了在这个范围内的一些特殊数字,这些数字可以构成连续整数序列的一部分。
- 处理边界情况:
- 在开始计算之前,为了处理边界情况,我们在
special
列表的前后分别添加bottom - 1
和top + 1
。这两个数字不在目标范围内,但这样做可以帮助我们计算从bottom
开始到第一个特殊数字以及从最后一个特殊数字到top
结束之间的连续整数序列长度。
- 在开始计算之前,为了处理边界情况,我们在
- 排序:
- 将
special
列表进行排序,确保数字是按升序排列的。这是因为在连续整数序列中,每个数字都应该比前一个数字大1。
- 将
- 计算连续序列长度:
- 使用
pairwise
函数(来自itertools
模块,但题目描述中未明确提及,可能是假设已知)来计算相邻元素之间的差值。pairwise
函数会返回一个迭代器,其中每个元素是一个元组,包含列表中的相邻项(x, y)
。 - 对每个
(x, y)
元组,计算y - x
,这将给出从x
到y
(不包括y
)之间的连续整数个数。注意,由于我们在列表的开头和结尾添加了bottom - 1
和top + 1
,这里的y - x
实际上表示的是从x+1
到y-1
的连续整数个数(因为我们要找的是严格大于前一个数的连续整数序列)。
- 使用
- 找出最大长度:
- 使用
max
函数找出所有计算出的连续整数序列长度的最大值。
- 使用
- 调整结果:
- 由于我们在计算长度时考虑了序列的起始和结束数字(即
x+1
到y-1
),而题目要求的是序列中数字的数量,因此需要从最大值中减去1来得到最终答案。这是因为我们在计算长度时包括了序列两端的边界效应(即添加的bottom - 1
和top + 1
导致的额外长度)。
- 由于我们在计算长度时考虑了序列的起始和结束数字(即