Medium
You are given a circular array nums
and an array queries
.
For each query i
, you have to find the following:
queries[i]
and any other index j
in the circular array, where nums[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:
queries[0] = 0
is nums[0] = 1
. The nearest index with the same value is 2, and the distance between them is 2.queries[1] = 3
is nums[3] = 4
. No other index contains 4, so the result is -1.queries[2] = 5
is nums[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 <= 105
1 <= nums[i] <= 106
0 <= queries[i] < nums.length
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Solution {
public List<Integer> solveQueries(int[] nums, int[] queries) {
int sz = nums.length;
Map<Integer, List<Integer>> indices = new HashMap<>();
for (int i = 0; i < sz; i++) {
indices.computeIfAbsent(nums[i], k -> new ArrayList<>()).add(i);
}
for (List<Integer> arr : indices.values()) {
int m = arr.size();
if (m == 1) {
nums[arr.get(0)] = -1;
continue;
}
for (int i = 0; i < m; i++) {
int j = arr.get(i);
int f = arr.get((i + 1) % m);
int b = arr.get((i - 1 + m) % m);
int forward = Math.min((sz - j - 1) + f + 1, Math.abs(j - f));
int backward = Math.min(Math.abs(b - j), j + (sz - b));
nums[j] = Math.min(backward, forward);
}
}
List<Integer> res = new ArrayList<>();
for (int q : queries) {
res.add(nums[q]);
}
return res;
}
}