文章目录

题目描述
题目链接:力扣 1848. 到目标元素的最小距离

示例 1:
输入:nums = [1,2,3,4,5], target = 5, start = 3
输出:1
解释:nums[4] == target ,且 abs(4 - 3) = 1 ,是最小的距离。
示例 2:输入:nums = [1], target = 1, start = 0
输出:0
解释:唯一的下标就是 target 所在位置,距离为 0 。
提示:1 <= nums.length <= 1000
1 <= nums[i] <= 104
0 <= start < nums.length
target 存在于 nums 中
思路简述
今天是奖励题,这道题是简单题中的"直球题",没有太多弯弯绕绕,核心思路就是暴力遍历 + 打擂台求最小值。
我们只需要做两件事:
- 从头到尾扫一遍数组,找到所有值等于
target的下标。 - 对于每一个找到的下标,计算它和
start的绝对距离,同时维护一个"当前最小距离",只要遇到更小的距离就更新它。
因为题目保证了 target 一定存在,所以最后直接返回这个最小距离就行。
代码实现
cpp
class Solution {
public:
int getMinDistance(vector<int>& nums, int target, int start) {
// 初始化结果为一个很大的数(INT_MAX),方便后续打擂台
int ret = INT_MAX;
// 遍历数组中的每一个下标 i
for(int i = 0; i < nums.size(); i++)
{
// 如果当前位置的值等于 target
if(nums[i] == target)
{
// 计算距离,并和当前的最小值 ret 比较,取较小的那个更新 ret
ret = min(ret, abs(i - start));
}
}
// 遍历结束后,ret 就是最小距离
return ret;
}
};
复杂度分析
-
时间复杂度 :
O(n)其中
n是数组nums的长度。我们只需要遍历一次数组,每个元素只看一眼,所以时间是线性的。 -
空间复杂度 :
O(1)我们只开了几个变量(
ret和循环变量i),没有用额外的数组、哈希表等结构,所以空间是常数级的。
踩坑记录
-
初始值必须设得足够大
用来存结果的变量
ret必须初始化为一个比所有可能的距离都大的值,比如INT_MAX。如果图省事初始化为 0,那min函数就永远不会更新它,结果就错了。 -
题目保证存在 target,无需兜底
题目明确说了"数据保证 target 存在于 nums 中",所以最后不用处理
ret还是INT_MAX的情况,直接返回就行。如果是自己在面试中写这道题,最好还是问一下面试官是否需要处理 target 不存在的情况,显得严谨。 -
注意下标是从 0 开始的
题目里明确说了下标从 0 开始,虽然这道题只是计算绝对差,不怎么涉及下标越界操作,但养成看清楚下标范围的习惯很重要哦。
如果这篇博客对你有帮助,别忘了点赞支持一下~也可以收藏起来,方便后续刷题复习时随时翻看。要是能顺手点个关注,爱弥斯还能得到漂泊者批准的游戏时间哦!
