Find All K-Distant Indices in an Array
EasyPrompt
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.
Example 1:
nums[2] == keyExample 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].
Constraints:
1 <= nums.length <= 10001 <= nums[i] <= 1000keyis an integer from the arraynums.1 <= k <= nums.length
Approaches
4 approaches with complexity analysis and trade-offs.
This approach directly translates the problem definition into code. It iterates through every possible index i in the array and, for each i, performs a full scan of the array to check if it satisfies the k-distant condition.
Algorithm
- Initialize an empty list
result. - Loop with index
ifrom0tonums.length - 1. - Inside the loop, start another loop with index
jfrom0tonums.length - 1. - Check if
nums[j] == keyandMath.abs(i - j) <= k. - If the condition is true, add
itoresultandbreakthe inner loop (since we only need one suchjto exist). - Return
result.
Walkthrough
For each index i from 0 to n-1, we need to determine if it's a k-distant index. To do this, we perform another full scan of the array using an index j. In this inner scan, we look for an index j where nums[j] is equal to the key and the absolute difference |i - j| is less than or equal to k. If such a j is found, we confirm that i is a k-distant index. We then add i to our result list and can immediately stop searching for this i (by breaking the inner loop) and move to the next index i+1. Since we iterate i in increasing order, the resulting list will naturally be sorted.
class Solution { public List<Integer> findKDistantIndices(int[] nums, int key, int k) { List<Integer> result = new ArrayList<>(); int n = nums.length; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (nums[j] == key && Math.abs(i - j) <= k) { result.add(i); break; // Found a valid j, move to the next i } } } return result; }}Complexity
Time
O(N^2), where N is the length of the `nums` array. The outer loop runs N times, and for each iteration, the inner loop can run up to N times.
Space
O(N) in the worst case for storing the result list, where N is the number of elements in `nums`. This occurs if all indices are k-distant.
Trade-offs
Pros
Very simple to understand and implement.
Directly follows the problem statement.
Cons
Highly inefficient due to nested loops, leading to a quadratic time complexity.
Likely to result in a 'Time Limit Exceeded' error on platforms with stricter time limits for larger inputs.
Solutions
Solution
class Solution {public List<Integer> findKDistantIndices(int[] nums, int key, int k) { int n = nums.length; List<Integer> ans = new ArrayList<>(); for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { if (Math.abs(i - j) <= k && nums[j] == key) { ans.add(i); break; } } } return ans; }}Video walkthrough
Newsletter
One sharp idea, every week
System design and interview prep — short enough to finish.
No spam. Unsubscribe anytime.
Practice
Same difficulty — related problems to reinforce the pattern.