Find All K-Distant Indices in an Array
EasyUpdated: Aug 2, 2025
Practice on:
Problem
You are given a 0-indexed integer array nums and two integers key and k. A k-distant index is an index i of nums for which there exists at least one index j such that |i - j| <= k and nums[j] == key.
Return a list of all k-distant indices sorted in increasing order.
Examples
Example 1:
Input: nums = [3,4,9,1,3,9,5], key = 9, k = 1
Output: [1,2,3,4,5,6]
Explanation: Here, nums[2] == key and nums[5] == key.
- For index 0, |0 - 2| > k and |0 - 5| > k, so there is no j where |0 - j| <= k and nums[j] == key. Thus, 0 is not a k-distant index.
- For index 1, |1 - 2| <= k and nums[2] == key, so 1 is a k-distant index.
- For index 2, |2 - 2| <= k and nums[2] == key, so 2 is a k-distant index.
- For index 3, |3 - 2| <= k and nums[2] == key, so 3 is a k-distant index.
- For index 4, |4 - 5| <= k and nums[5] == key, so 4 is a k-distant index.
- For index 5, |5 - 5| <= k and nums[5] == key, so 5 is a k-distant index.
- For index 6, |6 - 5| <= k and nums[5] == key, so 6 is a k-distant index.
Thus, we return [1,2,3,4,5,6] which is sorted in increasing order.
Example 2:
Input: nums = [2,2,2,2,2], key = 2, k = 2
Output: [0,1,2,3,4]
Explanation: For all indices i in nums, there exists some index j such that |i - j| <= k and nums[j] == key, so every index is a k-distant index.
Hence, we return [0,1,2,3,4].
Solution
Method 1 - Using Set
To solve this problem:
- Identify all indices
jwherenums[j] == key. - For each such index
j, add all indicesiin the range[j - k, j + k]to a set to avoid duplicates. - Convert the set to a sorted list before returning it.
Code
Java
public class Solution {
public List<Integer> findKDistantIndices(int[] nums, int key, int k) {
Set<Integer> kDistantIndices = new HashSet<>();
// Identify all indices where nums[j] == key
for (int j = 0; j < nums.length; j++) {
if (nums[j] == key) {
// For each such index j, add all indices in range [j-k, j+k] to
// the set
int start = Math.max(0, j - k);
int end = Math.min(nums.length - 1, j + k);
for (int i = start; i <= end; i++) {
kDistantIndices.add(i);
}
}
}
// Convert the set to a sorted list
List<Integer> result = new ArrayList<>(kDistantIndices);
Collections.sort(result);
return result;
}
}
Python
def findKDistantIndices(nums, key, k):
k_distant_indices = set()
# Identify all indices where nums[j] == key
for j in range(len(nums)):
if nums[j] == key:
# For each such index j, add all indices in range [j-k, j+k] to the set
start = max(0, j - k)
end = min(len(nums) - 1, j + k)
for i in range(start, end + 1):
k_distant_indices.add(i)
# Convert the set to a sorted list
return sorted(k_distant_indices)
Complexity
- ⏰ Time complexity:
O(n log n)- We iterate through the entire array
numsexactly once to identify the indices wherenums[j] == key⇨ O(n) time - For each index
jwherenums[j] == key, we add indices in the range[j - k, j + k]to a set. - In the worst case, there could be (n) such key indices.
- For each key index
j, adding indices to the set could takeO(k), but this is bounded by the length of the subarray size, implying an upper limit proportional to (n) because (j - k) to (j + k) is at most 2k elements, and k can be up to (n). - Thus, adding elements to the set takes (O(n \times k)) but seen as (O(n)) since k is a constant compared to the linear scan.
- Sorting a list of size
ntakes (O(n \log n)).
- We iterate through the entire array
- 🧺 Space complexity:
O(n)