Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、问题描述
给你一个下标从 0 开始的整数数组 nums
和两个整数 key
和 k
。K 近邻下标 是 nums
中的一个下标 i
,并满足至少存在一个下标 j
使得 |i - j| <= k
且 nums[j] == key
。
以列表形式返回按 递增顺序 排序的所有 K 近邻下标。
题目链接:数组中的所有 K 近邻下标。
二、题目要求
样例
输入: nums = [3,4,9,1,3,9,5], key = 9, k = 1
输出: [1,2,3,4,5,6]
解释: 因此,nums[2] == key 且 nums[5] == key 。
- 对下标 0 ,|0 - 2| > k 且 |0 - 5| > k ,所以不存在 j 使得 |0 - j| <= k 且 nums[j] == key 。
所以 0 不是一个 K 近邻下标。
- 对下标 1 ,|1 - 2| <= k 且 nums[2] == key ,所以 1 是一个 K 近邻下标。
- 对下标 2 ,|2 - 2| <= k 且 nums[2] == key ,所以 2 是一个 K 近邻下标。
- 对下标 3 ,|3 - 2| <= k 且 nums[2] == key ,所以 3 是一个 K 近邻下标。
- 对下标 4 ,|4 - 5| <= k 且 nums[5] == key ,所以 4 是一个 K 近邻下标。
- 对下标 5 ,|5 - 5| <= k 且 nums[5] == key ,所以 5 是一个 K 近邻下标。
- 对下标 6 ,|6 - 5| <= k 且 nums[5] == key ,所以 6 是一个 K 近邻下标。
因此,按递增顺序返回 [1,2,3,4,5,6] 。
复制代码
考察
1.循环判断简单题型
2.建议用时10~30min
复制代码
三、问题分析
这一题一开始看题目感觉比较难,但看了案例之后其实就是普通的循环判断。这一题,分两步解决:
1.找出 j
j是什么?对数组nums进行判断,如果nums[j]==key,那么下标j存入v2数组中,留着备用。
2.找出 i
i就是近邻下标,第一重for循环遍历数组nums,第二重for循环是存储j的数组v2。
i和任意v2数组中的元素只要满足:abs(i-v2[j])<=k,那么i存入数组v1。
拓展:
abs代表取绝对值。
四、编码实现
class Solution {
public:
vector<int> findKDistantIndices(vector<int>& nums, int key, int k) {
int i,j,n=nums.size();//初始化定义
vector<int>v1,v2;//数组v1 v2
for(j=0;j<n;j++)//找出 j
if(nums[j]==key)//与key相等
v2.push_back(j);
for(i=0;i<n;i++)//找出 i
{
for(j=0;j<v2.size();j++)
{
if(abs(i-v2[j])<=k)//判断条件
{
v1.push_back(i);
break;//只要有一个满足就退出,不需要完全遍历
}
}
}
return v1;
}
};
复制代码