3181. Find Building Where Alice And Bob Can Meet¶
Difficulty: Hard
LeetCode Problem View on GitHub
3181. Find Building Where Alice and Bob Can Meet
Hard
You are given a 0-indexed array heights of positive integers, where heights[i] represents the height of the ith building.
If a person is in building i, they can move to any other building j if and only if i < j and heights[i] < heights[j].
You are also given another array queries where queries[i] = [ai, bi]. On the ith query, Alice is in building ai while Bob is in building bi.
Return an array ans where ans[i] is the index of the leftmost building where Alice and Bob can meet on the ith query. If Alice and Bob cannot move to a common building on query i, set ans[i] to -1.
Example 1:
Input: heights = [6,4,8,5,2,7], queries = [[0,1],[0,3],[2,4],[3,4],[2,2]] Output: [2,5,-1,5,2] Explanation: In the first query, Alice and Bob can move to building 2 since heights[0] < heights[2] and heights[1] < heights[2]. In the second query, Alice and Bob can move to building 5 since heights[0] < heights[5] and heights[3] < heights[5]. In the third query, Alice cannot meet Bob since Alice cannot move to any other building. In the fourth query, Alice and Bob can move to building 5 since heights[3] < heights[5] and heights[4] < heights[5]. In the fifth query, Alice and Bob are already in the same building. For ans[i] != -1, It can be shown that ans[i] is the leftmost building where Alice and Bob can meet. For ans[i] == -1, It can be shown that there is no building where Alice and Bob can meet.
Example 2:
Input: heights = [5,3,8,2,6,1,4,6], queries = [[0,7],[3,5],[5,2],[3,0],[1,6]] Output: [7,6,-1,4,6] Explanation: In the first query, Alice can directly move to Bob's building since heights[0] < heights[7]. In the second query, Alice and Bob can move to building 6 since heights[3] < heights[6] and heights[5] < heights[6]. In the third query, Alice cannot meet Bob since Bob cannot move to any other building. In the fourth query, Alice and Bob can move to building 4 since heights[3] < heights[4] and heights[0] < heights[4]. In the fifth query, Alice can directly move to Bob's building since heights[1] < heights[6]. For ans[i] != -1, It can be shown that ans[i] is the leftmost building where Alice and Bob can meet. For ans[i] == -1, It can be shown that there is no building where Alice and Bob can meet.
Constraints:
1 <= heights.length <= 5 * 1041 <= heights[i] <= 1091 <= queries.length <= 5 * 104queries[i] = [ai, bi]0 <= ai, bi <= heights.length - 1
Solution¶
class Solution {
public int[] leftmostBuildingQueries(int[] heights, int[][] queries) {
int n = heights.length;
int[][] st = new int[n][20];
int[] Log = new int[n + 1];
Log[0] = -1;
for (int i = 1; i <= n; i++) Log[i] = Log[i >> 1] + 1;
for (int i = 0; i < n; i++) st[i][0] = heights[i];
for (int i = 1; i < 20; i++) {
for (int j = 0; j + (1 << i) <= n; j++) {
st[j][i] = Math.max(st[j][i - 1], st[j + (1 << (i - 1))][i - 1]);
}
}
int[] res = new int[queries.length];
for (int i = 0; i < queries.length; i++) {
int l = queries[i][0], r = queries[i][1];
if (l > r) {
int temp = l;
l = r;
r = temp;
}
if (l == r) {
res[i] = l;
continue;
}
if (heights[r] > heights[l]) {
res[i] = r;
continue;
}
int maxHeight = Math.max(heights[l], heights[r]);
int left = r + 1, right = n, mid;
while (left < right) {
mid = (left + right) / 2;
int k = Log[mid - r + 1];
int maxInRange = Math.max(st[r][k], st[mid - (1 << k) + 1][k]);
if (maxInRange > maxHeight) right = mid;
else left = mid + 1;
}
res[i] = (left == n) ? -1 : left;
}
return res;
}
}
Complexity Analysis¶
- Time Complexity:
O(?) - Space Complexity:
O(?)
Approach¶
Detailed explanation of the approach will be added here