题意:给定一个升序排列的数组,找到k个与x最相近的元素(即差值最小),返回的结果必须要是按升序排好的。如果有两个数与 x的差值一样,优先选择数值较小的那个数。

解法一:双指针(排除法),一个一个删,因为是有序数组,且返回的是连续升序子数组,所以每一次删除的元素一定是位于边界;如果数组含有共 7 个元素,要保留 3 个元素,因此要删除 4 个元素(arr.size()-k);因为要删除的元素都位于边界,于是可以使用双指针(左指针指向数组的第一个元素,右指针指向数组最后一个元素)对撞的方式确定保留区间。

将需要删除的元素个数作为循环的条件,当right指向的元素减去x 大于或等于 left指向的元素减去x 的距离时,说明left指向的元素更接近x,故将right-1。(因为如果有两个数与 x的差值一样,优先选择数值较小的那个数)所以等于也是将right-1; 否则 left+1。

class Solution {
public:vector<int> findClosestElements(vector<int>& arr, int k, int x) {int size = arr.size(), n = size-k;int left = 0, right = size-1;while(n){if(x - arr[left] <= arr[right] - x)right--;elseleft++;n--;}vector<int> a;
//        for(int i=left; i<=right; ++i)
//            a.push_back(arr[i]);a.assign(arr.begin()+left, arr.begin()+right+1);return a;}
};

解法二: Binary Search

这道题的Binary Search 真的不好想 :(   下面是我整理的解题思路,参考了很多大神的思路(链接如下),突然发现二分搜索有好多变种啊,搞得我有点晕晕的。

我用的两个二分搜索模板:https://www.acwing.com/blog/content/31/

对应的讲解视频:https://www.bilibili.com/video/av41422769

二分搜索github的总结贴:https://github.com/yuzhoujr/leetcode/issues/8

二分搜索的总结博客:http://blackblog.tech/2018/10/08/LeetCode2Divide/#more

youtube上讲解这道题用二分搜索的视频:https://www.youtube.com/watch?v=3ifFNvdfjyg

class Solution {
public:vector<int> findClosestElements(vector<int>& arr, int k, int x) {int left = 0, right = arr.size()-k;while(left< right){int mid = left + (right-left)/2;if(x> arr[mid]){if(x-arr[mid] > arr[mid+k]-x)left = mid+1;elseright = mid;}elseright = mid;}return vector<int>(arr.begin()+left, arr.begin()+left+k);}
};

转载于:https://www.cnblogs.com/Bella2017/p/11223088.html

(双指针、二分Binary Search) leetcode 658. Find K closest Elements相关推荐

  1. [Leetcode]658. Find K Closest Elements

    # [[Leetcode]658. Find K Closest Elements](https://leetcode.com/problems/find-k-closest-elements/) - ...

  2. LeetCode:658. Find K Closest Elements程序分析

    好久没有练习算法了,以此纪研究生以来第一次练习算法题. 原题链接:https://leetcode.com/problems/find-k-closest-elements/description/ ...

  3. leetcode 658. Find K Closest Elements | 658. 找到 K 个最接近的元素(二分查找+双指针)

    题目 https://leetcode.com/problems/find-k-closest-elements/ 题解 在arr中找到第一个小于等于x的位置mid,然后再根据题意,用双指针分别向左. ...

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

    leetcode 658. 找到 K 个最接近的元素 题目描述: 给定一个排序好的数组 arr ,两个整数 k 和 x ,从数组中找到最靠近 x(两数之差最小)的 k 个数.返回的结果必须要是按升序排 ...

  5. LeetCode——658. 找到 K 个最接近的元素(双指针)

    文章目录 658. 找到 K 个最接近的元素(双指针) 题目 1.双指针法 思想:** 代码 2.二分法 思想:** 代码 658. 找到 K 个最接近的元素(双指针) 来源:力扣(LeetCode) ...

  6. Java实现 LeetCode 658 找到 K 个最接近的元素(暴力)

    658. 找到 K 个最接近的元素 给定一个排序好的数组,两个整数 k 和 x,从数组中找到最靠近 x(两数之差最小)的 k 个数.返回的结果必须要是按升序排好的.如果有两个数与 x 的差值一样,优先 ...

  7. LeetCode 658. 找到 K 个最接近的元素(二分查找)

    1. 题目 给定一个排序好的数组,两个整数 k 和 x,从数组中找到最靠近 x(两数之差最小)的 k 个数.返回的结果必须要是按升序排好的.如果有两个数与 x 的差值一样,优先选择数值较小的那个数. ...

  8. leetcode 347. Top K Frequent Elements | 347. 前 K 个高频元素(大根堆)

    题目 https://leetcode.com/problems/top-k-frequent-elements/ 题解 参考:leetcode 215. Kth Largest Element in ...

  9. Leetcode - 347. Top K Frequent Elements(堆排序)

    Given a non-empty array of integers, return the k most frequent elements. Example 1: Input: nums = [ ...

最新文章

  1. 一招教你掌握肌肉发力的感觉
  2. Java 动态写轮眼 SharinganJPanel (整理)
  3. MySql 创建存储过程
  4. Android中WebService的应用
  5. webapi 设置参数可为空_Web API系列(二):灵活多样的路由配置
  6. 安卓逆向系列教程(二)APK 和 DEX
  7. 面对 10 亿数据量的挑战,如何对系统进行性能优化?
  8. ES6基础教程一 学习笔记
  9. 不用游标遍历数据库执行脚本
  10. 2019美赛b题:基于Weighted-K-means聚类模型的选址
  11. php 开发一元夺宝插件,yiyuanyungou 一元云购商城源码,商用 ci框架开发,带指定中奖插件 Other systems 其他 249万源代码下载- www.pudn.com...
  12. ISO 9001是什么?ISO 9001 质量管理体系详细介绍
  13. winform打开PDF,显示在窗口
  14. 单行文本溢出隐藏显示省略号
  15. 计算机主板cpu插座分类,Intel历代CPU插槽类型、架构、常用主板大全
  16. WIN10解决“任务管理器被系统管理员禁用”问题
  17. 超越传统微调!Meta新作VPT:视觉Prompt来了!冻结主干,仅调节1%参数,性能提升显著!...
  18. 多客户端访问mysql_解决关于多客户端操作数据库并发问题
  19. 网站推广秘诀二十法(经试验有效,最后有绝招)
  20. (C语言)输入一行字符,将此字符串中最长的单词输出。

热门文章

  1. xml节点的添加和删除
  2. luogu P2791 幼儿园篮球题
  3. WannaCry勒索软件还在继续传播和感染中
  4. 如何保证用户登陆时提交密码已经加密
  5. ionic移动开发流程api
  6. Asp.Net MVC 教程
  7. linux mysql 操作命令
  8. (032) Linux之shell流控制for循环
  9. vtk类之vtkFixedPointVolumeRayCastMapper :一个固定像素点的体数据映射器
  10. 使用C#实现Windows下无焦点窗体