码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【每日一题】658. 找到 K 个最接近的元素


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

    给定一个 排序好 的数组 arr ,两个整数 k 和 x ,从数组中找到最靠近 x(两数之差最小)的 k 个数。返回的结果必须要是按升序排好的。

    整数 a 比整数 b 更接近 x 需要满足:

    • |a - x| < |b - x| 或者
    • |a - x| == |b - x| 且 a < b

    示例 1:

    输入:arr = [1,2,3,4,5], k = 4, x = 3
    输出:[1,2,3,4]
    

    示例 2:

    输入:arr = [1,2,3,4,5], k = 4, x = -1
    输出:[1,2,3,4]
    

    提示:

    • 1 <= k <= arr.length
    • 1 <= arr.length <= 104
    • arr 按 升序 排列
    • -104 <= arr[i], x <= 104
    1. class Solution {
    2. public List findClosestElements(int[] arr, int k, int x) {
    3. ArrayList ans = new ArrayList();
    4. int len = arr.length;
    5. int left = 0;
    6. int right = len - 1;
    7. while(left < right) {
    8. int mid = (left+right)/2;
    9. if(arr[mid]<=x) left = mid+1;
    10. else right = mid;
    11. }
    12. int front = left-1;
    13. int tail = left;
    14. for(int i = 0 ; i < k ; i++) {
    15. if(front < 0) {
    16. ans.add(arr[tail]);
    17. tail++;
    18. } else if(tail >= len) {
    19. ans.add(arr[front]);
    20. front--;
    21. } else {
    22. if(x-arr[front] <= arr[tail]-x) {
    23. ans.add(arr[front]);
    24. front--;
    25. } else{
    26. ans.add(arr[tail]);
    27. tail++;
    28. }
    29. }
    30. }
    31. Collections.sort(ans);
    32. return ans;
    33. }
    34. }

            每日一题,今天是中等题。实际难度也不高。

            读题,升序排列,查找。二分查找能解决。题目要求找到离x距离最近的k个数。那首先要找到x或者离x最近的数。最简单的方法就是二分先找到离x最近的数。那就先写一个二分,找到距离大于x的第一个数。left,right,len,mid老几件安排上。出二分后,left就是大于x的第一个数,但我们要找的是距离x最近的几个数,有可能大于x也有可能小于x。所以,出来之后,使用front来记录小于等于x的半部分,tail来记录大于等于x的半部分。tail=left,front=left-1,同时要注意x不一定在数组里,所以front和tail有可能不是有效的下标。需要先进行判断:(1)如果front<0说明已经没有比x小的数了。(2)如果right>=len就说明没有比x大的数了。由于k一定有相应解,所以一旦front和tail中的一个越界了,就只能往另一边找,直接加数就行。(3)如果front和tail都有效,那么就要判断谁离x比较近,由于题目有距离相同时取小的要求,所以等号要加在front--的这一部分代码上。找到之后放进arraylist里面,返回之前对其进行排序即可。

            今天这道中等题也不怎么难,熟悉二分估计很快就能做出来。结果如下:

  • 相关阅读:
    DJYROS产品:基于DJYOS的国产自主割草机器人解决方案
    alibaba.fastjson的使用(一)-- JSON、JSONObject、JSONArray的区别
    【Terminal】Mac给Terminal添加快捷键(Ctrl-Alt-T) & 通过几行js节省平常重复性的工作
    Redis命令及原理学习(一)
    LeetCode刷题(11)
    LFMCW雷达测速基础- 多普勒频移和2DFFT
    获得淘宝app商品详情原数据 API 的图解
    【MySQL】# 自定义变量、一行数据与多行的转换、IF函数
    【SQL server速成之路】——身份验证及建立和管理用户账户
    geant4代码讲解:basicB1(没写完)
  • 原文地址:https://blog.csdn.net/C_Ryson/article/details/133280711
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号