Meeting Room III
Jul 4, 2021
Last updated
Jul 4, 2021
Last updated
public class Solution {
/**
* @param intervals: the intervals
* @param rooms: the sum of rooms
* @param ask: the ask
* @return: true or false of each meeting
*/
public boolean[] meetingRoomIII(int[][] intervals, int rooms, int[][] ask) {
int maxTime = 0;
int[] events = new int[60000];
for (int[] interval : intervals) {
events[interval[0]]++;
events[interval[1]]--;
maxTime = Math.max(maxTime, interval[1]);
}
int[] prefixSum = new int[60000];
int roomNeeded = 0;
for (int i = 0; i <= maxTime; ++i) {
roomNeeded += events[i];
if (roomNeeded == rooms) {
prefixSum[i] = 1;
} else {
prefixSum[i] = 0;
}
}
for (int i = 1; i < prefixSum.length; ++i) {
prefixSum[i] = prefixSum[i - 1] + prefixSum[i];
}
boolean[] res = new boolean[ask.length];
for (int i = 0; i < ask.length; ++i) {
int start = ask[i][0];
int end = ask[i][1];
res[i] = prefixSum[end - 1] == prefixSum[start - 1];
}
return res;
}
}public class Solution {
class TreeNode {
int start, end, roomNeeded;
TreeNode left, right;
TreeNode(int start, int end, int roomNeeded, TreeNode left, TreeNode right) {
this.start = start;
this.end = end;
this.roomNeeded = roomNeeded;
this.left = left;
this.right = right;
}
}
private TreeNode construct(int[] roomRequirmentArr, int start, int end) {
if (start == end) return new TreeNode(start, end, roomRequirmentArr[start], null, null);
int mid = (start + end) / 2;
TreeNode left = construct(roomRequirmentArr, start, mid);
TreeNode right = construct(roomRequirmentArr, mid + 1, end);
return new TreeNode(start, end, Math.max(left.roomNeeded, right.roomNeeded), left, right);
}
private void update(TreeNode root, int index, int newRoomNeeded) {
// this method is not needed in this case
}
private int query(TreeNode root, int start, int end) {
if (root.start == start && root.end == end) return root.roomNeeded;
int mid = (root.start + root.end) / 2;
if (end <= mid) {
return query(root.left, start, end);
} else if (start > mid) {
return query(root.right, start, end);
} else {
return Math.max(query(root.left, start, mid), query(root.right, mid + 1, end));
}
}
private TreeNode root;
public boolean[] meetingRoomIII(int[][] intervals, int rooms, int[][] ask) {
int[] events = new int[50001];
for (int[] interval : intervals) {
events[interval[0]]++;
events[interval[1]]--;
}
int[] roomRequirementArr = new int[events.length];
int count = 0;
for (int i = 0; i < events.length; ++i) {
count += events[i];
roomRequirementArr[i] = count;
}
// System.out.println(Arrays.toString(roomRequirementArr));
this.root = construct(roomRequirementArr, 0, roomRequirementArr.length - 1);
boolean[] ret = new boolean[ask.length];
for (int i = 0; i < ask.length; ++i) {
int[] interval = ask[i];
// 如果区间内所需房间最大值小于给定房间数量
if (query(root, interval[0], interval[1] - 1) < rooms) ret[i] = true;
}
return ret;
}
}