【贪心】B_004 安排电影院座位(map + set)
一、題目描述
A cinema has n rows of seats, numbered from 1 to n and there are ten seats in each row, labelled from 1 to 10 as shown in the figure above.
Given the array reservedSeats containing the numbers of seats already reserved, for example, reservedSeats[i]=[3,8] means the seat located in row 3 and labelled with 8 is already reserved.
Return the maximum number of four-person families you can allocate on the cinema seats. A four-person family occupies fours seats in one row, that are next to each other. Seats across an aisle (such as [3,3] and [3,4]) are not considered to be next to each other, however, It is permissible for the four-person family to be separated by an aisle, but in that case, exactly two people have to sit on each side of the aisle.
輸入:n = 3, reservedSeats = [[1,2],[1,3],[1,8],[2,6],[3,1],[3,10]] 輸出:4 解釋:上圖所示是最優的安排方案,總共可以安排 4 個家庭。藍色的叉表示被預約的座位,橙色的連續座位表示一個 4 人家庭。Constraints:
- 1 <= n <= 10^9
1 <= reservedSeats.length <= min(10*n, 10^4)
reservedSeats[i].length == 2
1 <= reservedSeats[i][0] <= n
1 <= reservedSeats[i][1] <= 10
All reservedSeats[i] are distinct.
方法一:貪心
思路
- 求在 n 行,每行只有 10 個座位的影院中最多能安排 4 人連續座位的個數,每一行最多安排 2 個,最多能安排 2n 個連續座位,每一行能坐下 4 人家庭的位置只有 3 種情況,分別是:
- 2-5 的位置沒有預約。
- 4-7 的位置沒有預約。
- 6-9 的位置沒有預約。
這樣一來,感覺清晰多了,其實我們只要從每一行中計算出被預約的座位在哪即可,比如:初始狀態我們默認位置沒有被占據,即 can = 2:
先檢查兩側:
- 2~5 位置如果有預約,can--
- 6~9 如果有預約,can--
后檢查中間:
- 如果 can > 0,這表示有滿足的條件的 4 人家庭座位。
- 如果 can = 0,則需要對 4~7 的位置進行一次特判。為什么?
- 被預約的位置可能處于 2~3 或 8~9,但這些位置不影響安排 4~7 的 4 人連續家庭。
算法
- map 存儲位置全部行的預約信息,其中 key 為行數,val 為一行中的預約信息。
- 按照上面分析的思路對 map 中的每一行,即檢查 map 中每一個 set。
復雜度分析
- 時間復雜度:O(n×10)O(n × 10)O(n×10),
- 空間復雜度:O(n×10)O(n × 10)O(n×10),
總結
以上是生活随笔為你收集整理的【贪心】B_004 安排电影院座位(map + set)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 简单实现电影院选座效果
- 下一篇: SpringSecurity短信验证码登