首页 > 其他分享 >leetcode 658. 找到 K 个最接近的元素

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

时间:2024-12-13 17:44:28浏览次数:4  
标签:arr right int 元素 size leetcode 658 left

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

法一:

class Solution {
public:
    vector<int> findClosestElements(vector<int>& arr, int k, int x) {
        vector<pair<int,int>> dist;
        vector<int> res;
        int size = arr.size();
        for(int i = 0;i < size;++i){
            dist.emplace_back(abs(arr[i]-x),i);
        }
        sort(dist.begin(),dist.end());
        for(int i = 0;i < k;++i)  res.emplace_back(arr[dist[i].second]);
        sort(res.begin(),res.end());
        return res;
    }
};

法二:二分查找 + 双指针;不需考虑各种奇怪的边界条件,双指针会帮你判断

class Solution {
public:
//可以将数组 arr 分成两部分,前一部分所有元素 [0,left] 都小于 x,后一部分所有元素 [right,n−1] 都大于等于 x
//left 与 right 都可以通过二分查找获得。left 和 right 指向的元素都是各自部分最接近 x 的元素
//因此我们可以通过比较 left 和 right 指向的元素获取整体最接近 x 的元素
//如果 x−arr[left]≤arr[right]−x,那么将 left 减一,否则将 right 加一
//相应地,如果 left 或 right 已经越界,那么不考虑对应部分的元素。
//最后,区间 [left+1,right−1] 的元素就是我们所要获得的结果,返回答案既可。

    vector<int> findClosestElements(vector<int>& arr, int k, int x) {
        //lower_bound用于在有序区间中查找第一个大于或等于给定值的元素的位置,基于二分查找实现
        int right = lower_bound(arr.begin(), arr.end(), x) - arr.begin();
        int left = right - 1,size = arr.size();
        while(k--){
            if(left < 0)  ++right;
            else if(right >= size)  --left;
            else if(x - arr[left] <= arr[right] - x)  --left;
            else  ++right;
        }
        return vector<int>(arr.begin() + left + 1,arr.begin() + right);//表示返回[left+1,right−1]的元素
    }
};

 

标签:arr,right,int,元素,size,leetcode,658,left
From: https://www.cnblogs.com/uacs2024/p/18605422

相关文章

  • leetcode66:加一
    原题地址:66.加一-力扣(LeetCode)题目描述给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位,数组中每个元素只存储单个数字。你可以假设除了整数0之外,这个整数不会以零开头。示例 1:输入:digits=[1,2,3]输出:[......
  • LeetCode:3264、K次乘运算后的最终数组I
    题目:给你一个整数数组nums,一个整数k和一个整数multiplier。你需要对nums执行k次操作,每次操作中:找到nums中的最小值x,如果存在多个最小值,选择最前面的一个。将x替换为x*multiplier。请你返回执行完k次乘运算之后,最终的nums数组。示例1:输入:num......
  • 【Python网络爬虫笔记】11- Xpath精准定位元素
    目录一、Xpath在Python网络爬虫中的作用(一)精准定位元素(二)应对动态网页(三)数据结构化提取二、Xpath的常用方法(一)节点选取(二)谓词筛选(三)轴操作三、Xpath在Python中的安装和使用(一)安装(二)使用Xpath提取特定内容四、Xpath在Python网络爬虫中的典型案例(一)新闻网站......
  • 写一个方法检测指定的数组是否有重复的元素
    前端JavaScript中有多种方法可以检测数组中是否有重复元素。以下列出几种常见且有效的方法,并解释其优缺点:1.使用Set数据结构:这是最简洁和高效的方法之一。Set对象只允许存储唯一值,利用这个特性,我们可以轻松判断数组中是否有重复元素。functionhasDuplicates(arr){r......
  • 如何清除input元素聚焦时的边框
    清除input元素聚焦时的边框,可以使用CSS的outline属性。将其设置为none即可。input:focus{outline:none;}这个方法简单有效,但需要注意的是,去除轮廓会影响到键盘导航用户的可访问性。他们依赖视觉上的焦点指示来浏览网页。因此,最好提供替代的视觉提示。以下......
  • 如何让子元素不继承父元素的:hover效果?
    要防止子元素继承父元素的:hover效果,你可以使用以下几种方法:1.使用CSS的pointer-events属性:这是最简单直接的方法。在子元素上设置pointer-events:none;,可以阻止子元素接收鼠标事件,从而避免继承父元素的:hover效果。.parent{/*父元素样式*/}.parent:hover......
  • 写一个方法,批量删除指定索引的数组元素
    /***批量删除数组中指定索引的元素。**@param{Array}arr原数组*@param{Array<number>}indices要删除的元素的索引数组,必须按升序排列*@returns{Array}删除元素后的新数组,不会修改原数组*/functionremoveElementsAtIndexes(arr,indices){if(!Array......
  • 为什么有时候给元素设置宽度不起作用呢?
    在前端开发中,给元素设置宽度有时不起作用,原因有很多。以下是一些常见的情况和解决方法:1.元素的display属性:display:inline和display:inline-block:内联元素默认宽度由其内容决定。虽然inline-block允许设置宽度和高度,但如果内容超过了设置的宽度,元素仍然会扩展。......
  • 如果设置一个元素的字体为:font-size:18,没有写单位px,那么会默认有px的单位吗?
    不会。如果只写font-size:18没有单位,在浏览器中这声明是无效的,字体大小不会改变,会继承父元素的字体大小或者使用浏览器的默认字体大小。必须指定单位才能使font-size生效。常用的单位包括:px(像素):最常用的单位,指定字体大小为多少像素。font-size:18pxem:相对单......
  • 元素透明度样式
    opacity样式控制元素的透明度透明数值0到不透明数值1<!DOCTYPEhtml><html> <head> <metacharset="utf-8"/> <title></title> <style> *{ /*清楚元素默认样式*/ margin:0px; padding:0px; } body{ po......