一、问题描述
给你一个下标从 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] 。
考察
循环判断简单题型 建议用时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代表取绝对值。
四、编码实现
classSolution { public: vector<int>findKDistantIndices(vector<int>&nums, intkey, intk) { inti,j,n=nums.size();//初始化定义vector<int>v1,v2;//数组v1 v2for(j=0;j<n;j++)//找出 jif(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;//只要有一个满足就退出,不需要完全遍历 } } } returnv1; } };