2024-12-22 Daily Challenge

Today I have done leetcode's December LeetCoding Challenge with cpp.

December LeetCoding Challenge 22

Description

Find Building Where Alice and Bob Can Meet

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 * 104
  • 1 <= heights[i] <= 109
  • 1 <= queries.length <= 5 * 104
  • queries[i] = [ai, bi]
  • 0 <= ai, bi <= heights.length - 1

Solution

int sparseTable [50050][20] = {};
int logValue[50050] = {-1};
auto speedup = [](){
  cin.tie(nullptr);
  cout.tie(nullptr);
  ios::sync_with_stdio(false);
  for(int i = 1; i < 50049; ++i) {
    logValue[i] = logValue[i >> 1] + 1;
  }
  return 0;
}();
int getMax(int left, int right) {
    int k = logValue[right - left + 1];
    return max(sparseTable[left][k], sparseTable[right - (1 << k) + 1][k]);
}
class Solution {
public:
  vector<int> leftmostBuildingQueries(vector<int>& heights, vector<vector<int>>& queries) {
    int len = heights.size();
    sparseTable[len][0] = 2e9;
    for(int i = 0; i < len; ++i) {
      sparseTable[i][0] = heights[i];
    }
    for(int i = 1; i < 20; ++i) {
      for(int j = 0; j + (1 << i) - 1 <= len; ++j) {
        sparseTable[j][i] = max(sparseTable[j][i - 1], sparseTable[j + (1 <<(i - 1))][i - 1]);
      }
    }
    vector<int> answer;
    answer.reserve(queries.size());
    for(const auto &q : queries) {
      int left = q[0];
      int right = q[1];
      if(left > right) swap(left, right);
      if(left == right || heights[right] > heights[left]) {
        answer.push_back(right);
        continue;
      }
      int maxHeights = max(heights[left], heights[right]);
      int low = right;
      int high = len;
      while(low < high) {
        int mid = (low + high) / 2;
        if(getMax(right, mid) > maxHeights) {
          high = mid;
        } else {
          low = mid + 1;
        }
      }
      answer.push_back(low == len ? -1 : low);
    }
    return answer;
  }
};

// Accepted
// 952/952 cases passed (27 ms)
// Your runtime beats 100 % of cpp submissions
// Your memory usage beats 98.73 % of cpp submissions (239.3 MB)