日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【贪心】B_004 安排电影院座位(map + set)

發布時間:2023/12/31 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【贪心】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。
class Solution {public int maxNumberOfFamilies(int n, int[][] rss) {int tot = n << 1;Map<Integer, Set<Integer>> mp = new HashMap<>();for (int[] rs : rss) mp.computeIfAbsent(rs[0], k -> new HashSet<>()).add(rs[1]);for (Map.Entry<Integer, Set<Integer>> p : mp.entrySet()) {Set<Integer> st = p.getValue();int can = 2;for (int k = 2; k <= 5; k++) if (st.contains(k)) {can--;break;}for (int k = 6; k <= 9; k++) if (st.contains(k)) {can--;break;}if (can == 0) {can = 1;for (int k = 4 ; k <= 7; k++) {if (st.contains(k)) {can = 0;break;}}}if (can == 0) tot -= 2;if (can == 1) tot -= 1;}return tot;} }

復雜度分析

  • 時間復雜度:O(n×10)O(n × 10)O(n×10)
  • 空間復雜度:O(n×10)O(n × 10)O(n×10)

總結

以上是生活随笔為你收集整理的【贪心】B_004 安排电影院座位(map + set)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。