栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

实现思路:见代码注释。

C++代码实现
class Solution {
public:
    vector findClosestElements(vector& arr, int k, int x) {
        int n = arr.size();
        vector 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截图:

本题解仅作为个人复习查看使用,并无他用。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/656390.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号