LeetCode 1848:到目标元素的最小距离(详细技术解析,含面试考点)

张开发
2026/6/1 2:54:45 15 分钟阅读
LeetCode 1848:到目标元素的最小距离(详细技术解析,含面试考点)
LeetCode 1848到目标元素的最小距离详细技术解析含面试考点大家好今天给大家带来 LeetCode 简单难度题目——1848. 到目标元素的最小距离。这道题是数组操作的基础入门题核心考察数组查找、绝对值距离计算、最优解筛选三大基础编程思维代码简洁易懂不仅适合新手巩固数组操作基本功也是面试、笔试中高频出现的基础送分题。本文将从题目深度解析、多思路对比、代码优化、测试验证、避坑指南、面试延伸六个维度一步步讲透零基础也能轻松掌握助力大家快速通关并应对面试延伸提问。一、题目深度解析吃透题意规避隐形坑核心题意精准提炼给定整数数组nums下标从 0 开始、目标值target和起始下标start要求找到数组中所有值等于target的下标i计算每个i与start的距离abs(i - start)最终返回最小距离。核心关键词数组查找、绝对值距离、最小最优解题目保证target一定存在于数组中无需处理“目标值不存在”的异常场景降低解题难度。关键约束与隐含条件数据范围约束1 nums.length 1000数据量极小暴力遍历完全满足时间要求无需复杂优化距离定义严格为两个下标差的绝对值abs(i - start)不可混淆为“值的差”隐含条件数组中可能存在多个等于target的下标需遍历所有符合条件的下标不可遗漏如示例3中全为1的数组边界约束0 start nums.length起始下标一定合法无需额外判断越界。输入输出示例带场景分析示例 1单一目标值场景输入nums [1,2,3,4,5], target 5, start 3输出1场景分析数组中仅下标 4 对应值为 5与 start3 的距离为abs(4-3)1无其他可选目标直接返回该距离。示例 2单元素数组场景输入nums [1], target 1, start 0输出0场景分析数组仅1个元素且为目标值起始下标与目标下标一致距离为0最小距离极限值。示例 3多个目标值场景输入nums [1,1,1,1,1], target 1, start 0输出0场景分析数组中所有元素均为目标值起始下标0本身就是目标下标距离0为最小无需遍历后续元素可提前返回优化。二、解题思路分析多思路对比适配不同场景本题核心逻辑可拆解为“找目标下标 → 算距离 → 选最小”结合数据量约束提供两种思路分别适配“新手入门”和“面试优化”场景对比清晰便于选择。思路一暴力遍历法新手首选最优解最直观、最易实现的思路适合新手入门代码简洁无冗余时间复杂度完全达标。核心步骤初始化最小距离为一个极大值推荐设为数组长度因为数组最大下标差不会超过数组长度确保能被后续更小距离覆盖遍历数组的每一个下标i逐一判断nums[i]是否等于target若找到目标下标i计算当前距离abs(i - start)对比当前距离与已记录的最小距离更新最小距离优化点若当前距离为0直接返回0不可能存在更小的距离无需继续遍历遍历结束后返回最小距离。优缺点分析优点代码极简、逻辑直观、无边界坑点、易于调试适合新手快速上手缺点需遍历整个数组最坏情况但因数组长度≤1000性能无压力。思路二双向扩散法面试优化效率最优针对“数组极长”的延伸场景虽然本题数据量小但面试中可能被追问优化思路从起始下标start向左右两侧扩散找到第一个目标值即返回无需遍历全数组。核心步骤初始化扩散距离dist 0dist表示当前扩散的步数也是当前距离循环扩散向左扩散判断start - dist是否合法≥0且对应元素是否为target若是则返回dist向右扩散判断start dist是否合法 数组长度且对应元素是否为target若是则返回dist若两侧均未找到dist 1继续扩散优缺点分析优点效率最优找到最近目标值立即返回无需遍历全数组最好情况时间复杂度 O(1)缺点代码稍复杂需处理左右扩散的边界判断适合面试中展示优化思维。复杂度对比清晰直观解题思路时间复杂度空间复杂度适用场景暴力遍历法O(n)O(n)O(n)n为数组长度O(1)O(1)O(1)新手入门、日常刷题、代码简洁优先双向扩散法O(k)O(k)O(k)k为最近目标值与start的距离O(1)O(1)O(1)面试优化、数组极长场景三、代码实现严格符合题目格式带优化注释以下代码均严格遵循题目要求的class Solution格式带详细注释兼顾可读性和规范性可直接复制到LeetCode提交通过。实现一暴力遍历法新手推荐可直接提交暴力遍历法最优简洁版from typing import List class Solution: def getMinDistance(self, nums: List[int], target: int, start: int) - int: # 初始化最小距离为数组长度最大可能的距离确保能被更新 min_dist len(nums) # 遍历数组所有下标逐一检查目标值 for i in range(len(nums)): # 找到目标值对应的下标 if nums[i] target: # 计算当前下标与start的距离 current_dist abs(i - start) # 更新最小距离 if current_dist min_dist: min_dist current_dist # 提前返回优化距离为0时不可能更小直接返回 if min_dist 0: return 0 # 遍历结束返回最小距离 return min_dist实现二双向扩散法面试优化版双向扩散法效率最优版from typing import List class Solution: def getMinDistance(self, nums: List[int], target: int, start: int) - int: n len(nums) dist 0 # 扩散距离初始为0自身位置 while True: # 向左扩散判断边界合法且当前位置是目标值 if start - dist 0 and nums[start - dist] target: return dist # 向右扩散判断边界合法且当前位置是目标值 if start dist n and nums[start dist] target: return dist # 两侧均未找到扩散距离1继续查找 dist 1代码关键说明易错点标注初始化最小距离必须设为“大于最大可能距离”的值如数组长度若初始化为0会导致无法更新正确结果如示例1中距离为1无法覆盖初始值0提前返回优化暴力遍历法中找到距离0后直接返回可减少不必要的遍历如示例3无需遍历整个数组边界判断双向扩散法中必须先判断下标合法性start - dist 0、start dist n再判断元素是否为目标值避免下标越界兼容性两种实现均兼容所有边界场景单元素数组、start在开头/末尾、多个目标值无需额外加判断。四、测试用例验证全覆盖确保代码正确性以下测试用例覆盖“示例场景、边界场景、特殊场景”直接运行即可验证代码正确性同时可用于调试排查问题。完整测试用例含调试输出from typing import List # 选择要测试的实现二选一 class Solution: def getMinDistance(self, nums: List[int], target: int, start: int) - int: min_dist len(nums) for i in range(len(nums)): if nums[i] target: current_dist abs(i - start) if current_dist min_dist: min_dist current_dist if min_dist 0: return 0 return min_dist # 测试代码 if __name__ __main__: sol Solution() # 示例1单一目标值 test1 sol.getMinDistance([1,2,3,4,5], 5, 3) print(f示例1测试结果{test1}预期1) # 示例2单元素数组 test2 sol.getMinDistance([1], 1, 0) print(f示例2测试结果{test2}预期0) # 示例3多个目标值start为目标下标 test3 sol.getMinDistance([1,1,1,1,1], 1, 0) print(f示例3测试结果{test3}预期0) # 额外测试1多个目标值start在中间 test4 sol.getMinDistance([1,2,2,2,1], 2, 2) print(f额外测试1结果{test4}预期0) # 额外测试2多个目标值左右均有目标 test5 sol.getMinDistance([2,3,5,2,3], 2, 2) print(f额外测试2结果{test5}预期2) # 额外测试3start在末尾目标在开头 test6 sol.getMinDistance([4,5,6,7], 4, 3) print(f额外测试3结果{test6}预期3)运行结果所有测试用例均符合预期两种实现均可正常通过无报错、无逻辑漏洞。五、常见错误与避坑指南新手必看少走弯路整理4个新手高频错误结合具体场景说明原因及解决方案避免踩坑。错误1忘记遍历全部下标只向单侧查找场景如nums [2,3,2], target2, start1只向左查找会找到下标0距离1忽略下标2距离1虽结果正确但逻辑不严谨若start2只向左查找会找到下标0距离2忽略下标1无目标结果正确但遇到nums [2,1,2,1,2], start2时会多遍历无效元素。解决方案暴力遍历法需遍历全部下标双向扩散法同时向左右两侧扩散确保不遗漏。**错误2初始最小距离设置过小如0**场景如nums [1,2,3,4,5], target5, start3初始min_dist0后续计算的距离1无法更新min_dist最终返回0结果错误。解决方案初始最小距离设为数组长度最大可能距离确保所有合法距离都能覆盖。错误3双向扩散法边界判断顺序错误场景先判断nums[start - dist] target再判断start - dist 0当start0, dist1时会出现下标越界报错。解决方案先判断下标合法性再判断元素是否为目标值短路逻辑避免越界。错误4忽略提前返回优化导致无效遍历场景如nums [1,1,1,1,1], start0遍历到下标0时已找到距离0仍继续遍历后续4个元素浪费性能虽不影响结果但面试中会被扣分。解决方案暴力遍历法中找到距离0后直接返回双向扩散法本身就是找到即返回无需额外优化。六、面试延伸与拓展提升文档价值助力面试本题虽简单但面试中常被追问延伸问题补充以下内容提升文档专业性和实用性帮助大家应对面试提问。延伸1如果数组中存在多个目标值如何快速找到所有目标下标并计算最小距离解答可先遍历数组收集所有目标下标存入列表再遍历列表计算每个下标与start的距离取最小值。代码示例如下延伸收集所有目标下标再计算from typing import List class Solution: def getMinDistance(self, nums: List[int], target: int, start: int) - int: # 收集所有目标值的下标 target_indices [i for i, num in enumerate(nums) if num target] # 计算每个目标下标与start的距离取最小值 return min(abs(i - start) for i in target_indices)优点逻辑清晰适合需要后续使用所有目标下标的场景缺点需额外存储目标下标空间复杂度变为O(k)O(k)O(k)k为目标下标个数。延伸2如果数组长度极大如1e6哪种思路更优为什么解答优先选择双向扩散法。原因暴力遍历法需遍历整个数组1e6次操作而双向扩散法只需遍历到最近的目标值最坏情况为1e6次最好情况为1次平均效率远高于暴力遍历法适合大数据量场景。延伸3如何处理“target可能不存在于数组中”的场景解答题目虽保证target存在但面试中可能被追问。解决方案在遍历结束后判断最小距离是否仍为初始值数组长度若为则返回-1表示目标值不存在代码示例暴力遍历法修改延伸处理target不存在场景from typing import List class Solution: def getMinDistance(self, nums: List[int], target: int, start: int) - int: min_dist len(nums) for i in range(len(nums)): if nums[i] target: current_dist abs(i - start) if current_dist min_dist: min_dist current_dist if min_dist 0: return 0 # 若min_dist未更新说明target不存在 return -1 if min_dist len(nums) else min_dist七、总结核心考点刷题建议核心考点回顾基础能力数组遍历、下标操作、绝对值计算Python内置abs()函数的使用逻辑思维最优解筛选最小距离更新、边界场景处理优化思维提前返回、双向扩散面试中展示优化意识代码规范严格遵循题目要求的类和方法格式注释清晰可读性强。刷题建议新手优先掌握暴力遍历法确保代码能正确提交理解核心逻辑进阶练习双向扩散法掌握“从中心向两侧扩散”的解题思路适配面试优化场景结合延伸问题练习拓展思维应对面试中的追问提升竞争力。本题是数组基础必刷题难度低但实用性强掌握后可快速应对同类基础题目。如果本文对你有帮助欢迎点赞、收藏、转发我会持续更新 LeetCode 题解从基础到进阶助力大家高效刷题、轻松面试~

更多文章