LeetCode 每日一题笔记
0. 前言
- 日期:2026.04.13
- 题目:1848.到目标元素的最小距离
- 难度:简单
- 标签:数组
1. 题目理解
问题描述 :
给你一个整数数组 nums(下标从 0 开始)以及两个整数 target 和 start,找出一个下标 i,满足 nums[i] == target 且 abs(i - start) 最小。
返回最小的绝对值。题目保证 target 一定存在于数组中。
示例:
输入:nums = [1,2,3,4,5], target = 5, start = 3
输出:1
解释:nums[4] = 5,abs(4-3)=1。
2. 解题思路
核心观察
- 要找离 start 最近的 target 位置,最小距离一定出现在 start 附近;
- 可以从 start 位置向左右两边同时遍历,找到第一个 target 就是最近的;
- 也可以分别向右、向左遍历所有 target,记录最小距离。
算法步骤
- 初始化最小距离为一个极大值;
- 从 start 向右遍历,遇到 target 就更新最小距离;
- 从 start 向左遍历,遇到 target 就更新最小距离;
- 遍历完成后返回最小距离。
3. 代码实现
java
package com.sheeta1998.lec.lc1848;
class Solution {
public int getMinDistance(int[] nums, int target, int start) {
int ans = 999999999;
for (int i = start; i < nums.length; i++) {
if (nums[i] == target) {
ans = Math.min(ans, Math.abs(start - i));
}
}
for (int i = start; i >= 0; i--) {
if (nums[i] == target) {
ans = Math.min(ans, Math.abs(start - i));
}
}
return ans;
}
}
4. 代码优化说明
优化点:提前找到立即返回(最优效率)
从 start 向左右同步扩展查找,找到第一个 target 就直接返回,不用遍历全数组:
java
class Solution {
public int getMinDistance(int[] nums, int target, int start) {
int n = nums.length;
int d = 0;
while (true) {
int left = start - d;
int right = start + d;
if (left >= 0 && nums[left] == target) return d;
if (right < n && nums[right] == target) return d;
d++;
}
}
}
5. 复杂度分析
-
时间复杂度 :O(n)O(n)O(n)
最多遍历一遍数组。
-
空间复杂度 :O(1)O(1)O(1)
仅使用常数变量。
6. 总结
- 核心思路:从起点向两侧查找目标值,取最小距离;
- 最优解法是逐层向外扩展,找到即返回,效率最高;
- 本题是简单的数组遍历与绝对值最小化问题。
关键点回顾
- 最近距离一定出现在 start 附近;
- 左右同时扩展查找是最优方案;
- 题目保证 target 存在,无需处理不存在情况。