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
When you get asked this question in a real-life environment, it will often be ambiguous (especially at FAANG). Make sure to ask these questions in that case:
The brute force approach to answering these questions is very direct. For each question, we simply search through the entire list of numbers. We'll find the two numbers closest to the question's position that match the question's value.
Here's how the algorithm would work step-by-step:
def closest_equal_element_queries_brute_force(elements, queries):
results = []
for query in queries:
query_index = query[0]
closest_index = -1
min_distance = float('inf')
# Iterate through all elements to find the closest equal element
for element_index in range(len(elements)):
# Check if the element's value matches the query value
if elements[element_index] == elements[query_index]:
distance = abs(element_index - query_index)
#Find the element with minimal distance
if distance < min_distance:
min_distance = distance
closest_index = element_index
results.append(closest_index)
return results
The key is to precompute and store the positions of each number in the original list. Then, for each query, we can quickly find the closest occurrences of the target number without iterating through the entire list repeatedly.
Here's how the algorithm would work step-by-step:
def closest_equal_element_queries(numbers, queries):
last_occurrence = {}
result = []
for index, number in enumerate(numbers):
last_occurrence[number] = index
for query_index, query_range in enumerate(queries):
left_boundary, target_index = query_range
minimum_distance = float('inf')
found = False
# Iterate through each unique number to find the closest
for number, last_index in last_occurrence.items():
# Check if the last seen index falls within the range
if left_boundary <= last_index <= target_index:
distance = abs(last_index - target_index)
# Update the minimum distance if a closer element is found
if distance < minimum_distance:
minimum_distance = distance
found = True
# If no element found in range set -1, else shortest distance
if not found:
result.append(-1)
else:
result.append(minimum_distance)
return result
Case | How to Handle |
---|---|
nums is null or empty | Return an empty list immediately since there are no elements to query. |
queries is null or empty | Return an empty list immediately since there are no queries to process. |
nums contains only one element | Return [-1] for all queries since there can be no other equal element. |
left index is out of bounds (negative or >= nums.length) | Return -1 for that specific query, or throw an exception to indicate an invalid query. |
right index is out of bounds (negative or >= nums.length) | Return -1 for that specific query, or throw an exception to indicate an invalid query. |
left > right | Return -1 for that query, indicating an invalid range. |
Large input array (nums.length is very large) with many queries | Optimize for time complexity, possibly using pre-computation or indexing. |
All numbers in nums are identical and the range includes more than one element. | Return left + 1 if left + 1 <= right, otherwise return -1. |