力扣第 284 场周赛 :数组中的所有 K 近邻下标

1,310 阅读1分钟

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;  
    }
};

五、测试结果

1.png

2.png