到目标元素的最小距离

58 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第18天,点击查看活动详情

题目描述

给你一个整数数组 nums (下标 从 0 开始 计数)以及两个整数 target 和 start ,请你找出一个下标 i ,满足 nums[i] == target 且 abs(i - start) 最小化 。注意:abs(x) 表示 x 的绝对值。
返回 abs(i - start) 。
题目数据保证 target 存在于 nums 中。
来源:力扣(LeetCode)

  • 示例 1
输入:nums = [1,2,3,4,5], target = 5, start = 3
输出:1
解释:nums[4] = 5 是唯一一个等于 target 的值,所以答案是 abs(4 - 3) = 1
  • 示例 2
输入:nums = [1], target = 1, start = 0
输出:0
解释:nums[0] = 1 是唯一一个等于 target 的值,所以答案是 abs(0 - 0) = 0
  • 示例 3
输入:nums = [1,1,1,1,1,1,1,1,1,1], target = 1, start = 0
输出:0
解释:nums 中的每个值都是 1 ,但 nums[0] 使 abs(i - start) 的结果得以最小化,所以答案是 abs(0 - 0) = 0

提示:

  • 1 <= s.length <= 100
  • s 只包含小写英文字母和数字。
  • 对所有 奇数 下标处的 i ,满足 shift(s[i-1], s[i]) <= 'z' 。

思路分析

题目给出一个整数数组nums和两个整数target、start,根据这两个整数在数组nums找出第i个元素离target距离最近的;规则是这样的:满足 nums[i] == target 且 abs(i - start)最小化,然后返回abs(i - start)。
声明一个变量res,表示最后结果的最小值;res用Infinity赋值Infinity表示最大值,后面方便比较大小;开始循环数组nums,如果循环项的值等于target,那么就代表已经找到了这个值了,剩下就需要往前退一位,计算abs(i - start)的值,求出绝对值,并与res比大小,取出较小的一位即可,再赋值给res,这样res就是我们的目标值了。

AC代码

function solution( nums, target, start ) {
    let res = Infinity;
    for(let i=0; i<nums.length; i++) {
        if(nums[i] === target) {
            res = Math.min(res, Math.abs(i - start));
        }
    }
    console.log(res);
}
let nums = [1,2,3,4,5], target = 5, start = 3;
solution( nums, target, start );