当前位置: 首页 > news >正文

找到K个最接近的元素

658. 找到 K 个最接近的元素 - 力扣(LeetCode)

Solution

逆向思维,首先知道的是原数组已经排好序了,如果正向去找的话,就得从最接近x的元素开始找,首先使用二分查找去找数组中最接近x的元素,然后用背向双指针去一个一个找,然后对结果数组进行排序,这是比较直接的一个想法。

但是使用逆向思维的话,首先可以发现,按正向的方式去寻找的话,答案一定是原数组中连续的一部分,那么就可以从两端去寻找n-k个不接近x的元素,剩下的就是答案。

  • 初始时,整个数组 [0, n-1] 是候选区间。
  • 我们的目标是保留 k 个最接近 x 的元素,等价于删除 n - k 个最不接近的元素
  • 每次比较 arr[l] 和 arr[r]
    • 如果 arr[l] 更接近 x(或距离相等但值更小),说明 arr[r] 更“不重要”,可以删掉 → r--
    • 否则,删掉 arr[l] → l++
  • 重复 n - k 次后,剩下的 [l, r] 就是答案。
  • 由于原数组是升序排列,所以 [l, r] 本身也是升序,无需排序

总之这种逆向思维的题还是很巧妙的,能够大大简化原做法。

class Solution {
public:vector<int> findClosestElements(vector<int>& arr, int k, int x) {int n=arr.size();vector<int>res;int l=0,r=n-1,cnt=0;while(l<=r&&cnt<n-k){if(abs(arr[l]-x)<abs(arr[r]-x)||abs(arr[l]-x)==abs(arr[r]-x)&&arr[l]<arr[r]){// temp.push_back(arr[r]);r--;cnt++;}else{// temp.push_back(arr[l]);l++;cnt++;}}for(int i=l;i<=r;++i){res.push_back(arr[i]);}// sort(res.begin(),res.end());return res;}
};

http://www.dtcms.com/a/503583.html

相关文章:

  • Java中JDK、JRE、JVM概念
  • MySQL 表操作核心指南:CRUD 与进阶技巧
  • 网站开发个人总结网页设计与网站建设在线考试1
  • 算法笔记 05
  • 游戏科技网站杭州建设工程交易中心网站
  • 网站做推广要备案吗四川seo快速排名
  • 有关房地产开发建设的网站哪些网站可以接点私活做的
  • 有关应广单片机数据类型与ROM空间优化的一点看法
  • 【2026计算机毕业设计】基于Jsp的医疗设备及业务综合巡检系统
  • 个人业务技能提升如何助力:从“做事”到“成事”的跃迁之路
  • 我们需要的中文编程是什么样子的?
  • 那些网站可以接私活做做兼职有哪些网站
  • 绚星智慧科技斩获智享会三项大奖,领跑AI时代学习与发展赛道
  • 零基础入门Java·基础篇 学习大纲
  • XSS 攻击详解:原理、类型与防范策略
  • 青岛网站建设 百度天津基础设施建设
  • 内蒙古住房和建设厅网站wordpress会员修改
  • 网站排名优化教程wordpress themes.php
  • 机器学习18:扩散模型(Diffusion Model)与Stable Diffusion
  • 17-机器学习与大模型开发数学教程-第1章 1-9 凸函数与凸优化基础
  • 空间建设网站企业建站程序推荐
  • 网站建设 点指成名网站开发调查问卷
  • 【经典书籍】C++ Primer 第10到12章精华讲解
  • 前端数据存储localStorage、sessionStorage 与 Cookie
  • 电影网站制作有哪些做微信小游戏的网站
  • Git从入门到精通教程
  • 课程视频网站建设的必要性色母图片
  • GEO内容更新与迭代策略:趋势话题的快速响应机制
  • 【Spring】Spring事务和事务传播机制
  • php网站开发源码网站开发部门结构