LeetCode题目记录-658. 找到 K 个最接近的元素(C++代码实现)

Posted wyy_persist

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode题目记录-658. 找到 K 个最接近的元素(C++代码实现)相关的知识,希望对你有一定的参考价值。

题目链接:https://leetcode-cn.com/problems/find-k-closest-elements/

题目要求:

实现思路:见代码注释。

C++代码实现

class Solution 
public:
    vector<int> findClosestElements(vector<int>& arr, int k, int x) 
        int n = arr.size();
        vector<int> res;


        
        //实现寻找数组中的k的位置
        int kIndex = -1;

        for(int i = 0;i < n;i++)
            if(arr[i] == x) 
                kIndex = i;
                break;
            
        

        //设置的int findFlag = 0;表示数组最小和最大值之间是否存在该元素
        int findFlag = 1;//1表示存在

        if(kIndex == -1)//数组中不存在该元素

            //表示数组中没有找到对应的元素
            if(x < arr[0])//表示x小于arr数组的最左边元素
                for(int i = 0;i < k;i++)//那么从0开始输出k个数即可
                    res.push_back(arr[i]);
                
                sort(res.begin(),res.end());
                return res;
            else if(x > arr[n - 1])//表示x大于arr数组的最右边元素
                for(int i = n - 1;i >= n - k;i --)//那么倒序输出数组中的k个数即可
                    res.push_back(arr[i]);
                
                sort(res.begin(),res.end());
                return res;
            else
                //表示该元素只是单纯地没有出现在arr数组中且其大小在数组的最大和最小值之间
                //这种情况下,寻找到第一个大于x的元素,并将其index作为kIndex
                for(int i = 0;i < n;i ++)
                    if(arr[i] > x)
                        kIndex = i;
                        break;
                    
                
            

            //对于该x元素大小值在数组的最大和最小值之间的情况进行操作
            //由于数组元素应当出现在该kIndex位置的前后两个元素中间
            //所以首先确定left指针的范围
            int lbegin = kIndex - k;
            if(lbegin < 0)
                lbegin = 0;//如果左边可能范围的开始位置小于0表示左边最少从0开始
            

            //确定右边指针的范围
            int rend = kIndex + k - 1;
            if(rend > n - 1)
                rend = n - 1;//如果右边的范围结束位置大于n - 1,那么表示右边最大到n - 1
            

            //while循环返回其中最接近的数
            int left = kIndex - 1;
            int right = kIndex;

            while(left >= lbegin && right <= rend)
                if((abs(arr[left] - x) < abs(arr[right] - x)) || (abs(arr[left] - x) == abs(arr[right] - x) && arr[left] < arr[right]))
                    //表示左边指针和x的差距小于右边指针,那么将左边指针指向的元素放入到res数组中
                    res.push_back(arr[left]);
                    //然后左边指针减1
                    left --;
                    //计数变量k减1
                    k--;
                    //判断k是否为0,是的话跳出循环
                    if(k == 0) break;
                else//如果上述两种情况都不满足,那么将右指针对应的元素放到res中去
                    res.push_back(arr[right]);
                    right++;
                    k--;
                    if(k == 0) break;
                
            

            if(k != 0 && right == rend + 1)//表示右指针已经到头了,那么将左指针的元素继续增加到res中
                while(left >= lbegin)
                    res.push_back(arr[left]);
                    left--;
                    k--;
                    if(k == 0) break;
                
            else if(k != 0 && left == lbegin - 1)
                while(right <= rend)
                    res.push_back(arr[right]);
                    right ++;
                    k--;
                    if(k == 0) break;
                
            

            sort(res.begin(),res.end());

        else//表示数组中存在该元素

            //由于数组可能出现在该kIndex位置的前后k个元素
            //所以首先确定left指针的范围
            int lbegin = kIndex - k + 1;
            if(lbegin < 0)
                lbegin = 0;//如果左边可能范围的开始位置小于0表示左边最少从0开始
            

            //确定右边指针的范围
            int rend = kIndex + k - 1;
            if(rend > n - 1)
                rend = n - 1;//如果右边的范围结束位置大于n - 1,那么表示右边最大到n - 1
            

            //while循环返回其中最接近的数
            int left = kIndex - 1;
            int right = kIndex + 1;

            k --;
            res.push_back(x);

            while(left >= lbegin && right <= rend)
                if((abs(arr[left] - x) < abs(arr[right] - x)) || (abs(arr[left] - x) == abs(arr[right] - x) && arr[left] < arr[right]))
                    //表示左边指针和x的差距小于右边指针,那么将左边指针指向的元素放入到res数组中
                    res.push_back(arr[left]);
                    //然后左边指针减1
                    left --;
                    //计数变量k减1
                    k--;
                    //判断k是否为0,是的话跳出循环
                    if(k == 0) break;
                else//如果上述两种情况都不满足,那么将右指针对应的元素放到res中去
                    res.push_back(arr[right]);
                    right++;
                    k--;
                    if(k == 0) break;
                
            

            if(k != 0 && right == rend + 1)//表示右指针已经到头了,那么将左指针的元素继续增加到res中
                while(left >= lbegin)
                    res.push_back(arr[left]);
                    left--;
                    k--;
                    if(k == 0) break;
                
            else if(k != 0 && left == lbegin - 1)
                while(right <= rend)
                    res.push_back(arr[right]);
                    right ++;
                    k--;
                    if(k == 0) break;
                
            
            sort(res.begin(),res.end());
        

        

        return res; 
    
;

AC截图:

本题解仅作为个人复习查看使用,并无他用。 

以上是关于LeetCode题目记录-658. 找到 K 个最接近的元素(C++代码实现)的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode 658.找到K个最接近的元素

leetcode 658找到k个最接近的元素

leetcode-658 找到K个最接近的元素

LeetCode 1460. 通过翻转子数组使两个数组相等 / 658. 找到 K 个最接近的元素 / 1464. 数组中两元素的最大乘积

LeetCode 1460. 通过翻转子数组使两个数组相等 / 658. 找到 K 个最接近的元素 / 1464. 数组中两元素的最大乘积

每日一题658. 找到 K 个最接近的元素