mirror of
https://gitee.com/coder-xiaomo/leetcode-problemset
synced 2025-01-11 02:58:13 +08:00
57 lines
3.7 KiB
HTML
57 lines
3.7 KiB
HTML
<p>一个音乐会总共有 <code>n</code> 排座位,编号从 <code>0</code> 到 <code>n - 1</code> ,每一排有 <code>m</code> 个座椅,编号为 <code>0</code> 到 <code>m - 1</code> 。你需要设计一个买票系统,针对以下情况进行座位安排:</p>
|
||
|
||
<ul>
|
||
<li>同一组的 <code>k</code> 位观众坐在<strong> 同一排座位,且座位连续 </strong>。</li>
|
||
<li><code>k</code> 位观众中 <strong>每一位</strong> 都有座位坐,但他们 <strong>不一定</strong> 坐在一起。</li>
|
||
</ul>
|
||
|
||
<p>由于观众非常挑剔,所以:</p>
|
||
|
||
<ul>
|
||
<li>只有当一个组里所有成员座位的排数都 <strong>小于等于</strong> <code>maxRow</code> ,这个组才能订座位。每一组的 <code>maxRow</code> 可能 <strong>不同</strong> 。</li>
|
||
<li>如果有多排座位可以选择,优先选择 <strong>最小</strong> 的排数。如果同一排中有多个座位可以坐,优先选择号码 <strong>最小</strong> 的。</li>
|
||
</ul>
|
||
|
||
<p>请你实现 <code>BookMyShow</code> 类:</p>
|
||
|
||
<ul>
|
||
<li><code>BookMyShow(int n, int m)</code> ,初始化对象,<code>n</code> 是排数,<code>m</code> 是每一排的座位数。</li>
|
||
<li><code>int[] gather(int k, int maxRow)</code> 返回长度为 <code>2</code> 的数组,表示 <code>k</code> 个成员中 <strong>第一个座位</strong> 的排数和座位编号,这 <code>k</code> 位成员必须坐在 <strong>同一排座位,且座位连续 </strong>。换言之,返回最小可能的 <code>r</code> 和 <code>c</code> 满足第 <code>r</code> 排中 <code>[c, c + k - 1]</code> 的座位都是空的,且 <code>r <= maxRow</code> 。如果 <strong>无法</strong> 安排座位,返回 <code>[]</code> 。</li>
|
||
<li><code>boolean scatter(int k, int maxRow)</code> 如果组里所有 <code>k</code> 个成员 <strong>不一定</strong> 要坐在一起的前提下,都能在第 <code>0</code> 排到第 <code>maxRow</code> 排之间找到座位,那么请返回 <code>true</code> 。这种情况下,每个成员都优先找排数 <strong>最小</strong> ,然后是座位编号最小的座位。如果不能安排所有 <code>k</code> 个成员的座位,请返回 <code>false</code> 。</li>
|
||
</ul>
|
||
|
||
<p> </p>
|
||
|
||
<p><strong>示例 1:</strong></p>
|
||
|
||
<pre>
|
||
<strong>输入:</strong>
|
||
["BookMyShow", "gather", "gather", "scatter", "scatter"]
|
||
[[2, 5], [4, 0], [2, 0], [5, 1], [5, 1]]
|
||
<strong>输出:</strong>
|
||
[null, [0, 0], [], true, false]
|
||
|
||
<strong>解释:</strong>
|
||
BookMyShow bms = new BookMyShow(2, 5); // 总共有 2 排,每排 5 个座位。
|
||
bms.gather(4, 0); // 返回 [0, 0]
|
||
// 这一组安排第 0 排 [0, 3] 的座位。
|
||
bms.gather(2, 0); // 返回 []
|
||
// 第 0 排只剩下 1 个座位。
|
||
// 所以无法安排 2 个连续座位。
|
||
bms.scatter(5, 1); // 返回 True
|
||
// 这一组安排第 0 排第 4 个座位和第 1 排 [0, 3] 的座位。
|
||
bms.scatter(5, 1); // 返回 False
|
||
// 总共只剩下 2 个座位。
|
||
</pre>
|
||
|
||
<p> </p>
|
||
|
||
<p><strong>提示:</strong></p>
|
||
|
||
<ul>
|
||
<li><code>1 <= n <= 5 * 10<sup>4</sup></code></li>
|
||
<li><code>1 <= m, k <= 10<sup>9</sup></code></li>
|
||
<li><code>0 <= maxRow <= n - 1</code></li>
|
||
<li><code>gather</code> 和 <code>scatter</code> <strong>总</strong> 调用次数不超过 <code>5 * 10<sup>4</sup></code> 次。</li>
|
||
</ul>
|