3750. Closest Equal Element Queries¶
3750. Closest Equal Element Queries
Medium
You are given a circular array nums and an array queries.
For each query i, you have to find the following:
- The minimum distance between the element at index
queries[i]and any other indexjin the circular array, wherenums[j] == nums[queries[i]]. If no such index exists, the answer for that query should be -1.
Return an array answer of the same size as queries, where answer[i] represents the result for query i.
Example 1:
Input: nums = [1,3,1,4,1,3,2], queries = [0,3,5]
Output: [2,-1,3]
Explanation:
- Query 0: The element at
queries[0] = 0isnums[0] = 1. The nearest index with the same value is 2, and the distance between them is 2. - Query 1: The element at
queries[1] = 3isnums[3] = 4. No other index contains 4, so the result is -1. - Query 2: The element at
queries[2] = 5isnums[5] = 3. The nearest index with the same value is 1, and the distance between them is 3 (following the circular path:5 -> 6 -> 0 -> 1).
Example 2:
Input: nums = [1,2,3,4], queries = [0,1,2,3]
Output: [-1,-1,-1,-1]
Explanation:
Each value in nums is unique, so no index shares the same value as the queried element. This results in -1 for all queries.
Constraints:
1 <= queries.length <= nums.length <= 1051 <= nums[i] <= 1060 <= queries[i] < nums.length
Solution¶
class Solution {
public List<Integer> solveQueries(int[] nums, int[] queries) {
List<Integer> res = new ArrayList<>();
int n = nums.length;
HashMap<Integer, TreeSet<Integer>> map = new HashMap<>();
for (int i = 0; i < n; i++) {
if (!map.containsKey(nums[i])) map.put(nums[i], new TreeSet<>());
map.get(nums[i]).add(i);
}
for (int ele : queries) {
int val = nums[ele];
TreeSet<Integer> current = new TreeSet<>();
current = map.get(val);
int dist = Integer.MAX_VALUE / 10;
if (current.higher(ele) != null) {
dist = Math.min(dist, Math.abs(ele - current.higher(ele)));
int new_dist = n - 1 - current.last() + (ele + 1);
dist = Math.min(dist, new_dist);
}
if (current.lower(ele) != null) {
int last_ind = current.first();
int new_dist = n - (ele + 1) + (last_ind + 1);
dist = Math.min(dist, new_dist);
dist = Math.min(dist, Math.abs(ele - current.lower(ele)));
}
if (dist == Integer.MAX_VALUE / 10) res.add(-1);
else res.add(dist);
}
return res;
}
}
Complexity Analysis¶
- Time Complexity: O(?)
- Space Complexity: O(?)
Explanation¶
[Add detailed explanation here]