Description
Given an integer array nums (0-indexed) and two integers target and start, find an index i such that nums[i] == target and abs(i - start) is minimized. Note that abs(x) is the absolute value of x.
Return abs(i - start).
It is guaranteed that target exists in nums.
Example 1:
Input: nums = [1,2,3,4,5], target = 5, start = 3 Output: 1 Explanation: nums[4] = 5 is the only value equal to target, so the answer is abs(4 - 3) = 1.
Example 2:
Input: nums = [1], target = 1, start = 0 Output: 0 Explanation: nums[0] = 1 is the only value equal to target, so the answer is abs(0 - 0) = 0.
Example 3:
Input: nums = [1,1,1,1,1,1,1,1,1,1], target = 1, start = 0 Output: 0 Explanation: Every value of nums is 1, but nums[0] minimizes abs(i - start), which is abs(0 - 0) = 0.
Constraints:
1 <= nums.length <= 10001 <= nums[i] <= 1040 <= start < nums.lengthtargetis innums.
Solutions
This is an optimized approach that expands outward from the starting position in both directions simultaneously. The variable end determines the maximum distance needed to search (the distance to the farther end of the array from the start position). The loop then checks both directions at each distance level: nums[start + i] for the right side and nums[start - i] for the left side. Since it checks increasing distances uniformly in both directions, the first match found is guaranteed to be at the minimum distance, allowing the function to return immediately without checking the entire array.
/**
* @param {number[]} nums
* @param {number} target
* @param {number} start
* @return {number}
*/
var getMinDistance = function(nums, target, start) {
let end = Math.max(start, nums.length - 1 - start);
for (let i = 0; i <= end; i++) {
if (nums[start + i] === target || nums[start - i] === target) {
return i;
}
}
return 0;
};