# 1386. Cinema Seat Allocation ###### tags: `Leetcode` `Medium` `Bit Manipulation` Link: https://leetcode.com/problems/cinema-seat-allocation/ ## 思路 ### 思路一 最简单直接的办法 如果某一行没有座位被占 就可以安排两组 如果有座位被占 则分情况讨论 ### 思路二 bit manipulation 运算符参考[这里](https://www.runoob.com/java/java-operators.html) ## Code ### 思路一 ```java= class Solution { public int maxNumberOfFamilies(int n, int[][] reservedSeats) { //4-7 2-5 6-9 Map<Integer, Set<Integer>> map = new HashMap<>(); for (int[] reservedSeat: reservedSeats){ map.putIfAbsent(reservedSeat[0], new HashSet<>()); map.get(reservedSeat[0]).add(reservedSeat[1]); } int res = 2*(n-map.size()); for(int row:map.keySet()){ Set<Integer> set = map.get(row); if(absentInSet(set, 2, 9)) res+=2; else if(absentInSet(set, 2, 5)||absentInSet(set, 6, 9)||absentInSet(set, 4, 7)) res+=1; } return res; } private boolean absentInSet(Set<Integer> set, int a, int b){ for(int i = a;i <= b;i++){ if(set.contains(i)) return false; } return true; } } ``` ### 思路二 ```java= class Solution { public int maxNumberOfFamilies(int n, int[][] reservedSeats) { Map<Integer, Integer> map = new HashMap<>(); for(int[] reservedSeat : reservedSeats){ map.put(reservedSeat[0], map.getOrDefault(reservedSeat[0],0)|(1<<reservedSeat[1])); } int res = 2*(n-map.size()); for(int row:map.keySet()){ int cnt = 0; int seats = map.get(row); if((seats&0b111100)==0) cnt += 1; if((seats&0b1111000000)==0) cnt += 1; if((seats&0b11110000)==0 && cnt==0) cnt += 1; res += cnt; } return res; } } ```