(双指针、二分Binary Search) leetcode 658. Find K closest Elements
题意:给定一个升序排列的数组,找到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相关推荐
- [Leetcode]658. Find K Closest Elements
# [[Leetcode]658. Find K Closest Elements](https://leetcode.com/problems/find-k-closest-elements/) - ...
- LeetCode:658. Find K Closest Elements程序分析
好久没有练习算法了,以此纪研究生以来第一次练习算法题. 原题链接:https://leetcode.com/problems/find-k-closest-elements/description/ ...
- leetcode 658. Find K Closest Elements | 658. 找到 K 个最接近的元素(二分查找+双指针)
题目 https://leetcode.com/problems/find-k-closest-elements/ 题解 在arr中找到第一个小于等于x的位置mid,然后再根据题意,用双指针分别向左. ...
- leetcode 658. 找到 K 个最接近的元素
leetcode 658. 找到 K 个最接近的元素 题目描述: 给定一个排序好的数组 arr ,两个整数 k 和 x ,从数组中找到最靠近 x(两数之差最小)的 k 个数.返回的结果必须要是按升序排 ...
- LeetCode——658. 找到 K 个最接近的元素(双指针)
文章目录 658. 找到 K 个最接近的元素(双指针) 题目 1.双指针法 思想:** 代码 2.二分法 思想:** 代码 658. 找到 K 个最接近的元素(双指针) 来源:力扣(LeetCode) ...
- Java实现 LeetCode 658 找到 K 个最接近的元素(暴力)
658. 找到 K 个最接近的元素 给定一个排序好的数组,两个整数 k 和 x,从数组中找到最靠近 x(两数之差最小)的 k 个数.返回的结果必须要是按升序排好的.如果有两个数与 x 的差值一样,优先 ...
- LeetCode 658. 找到 K 个最接近的元素(二分查找)
1. 题目 给定一个排序好的数组,两个整数 k 和 x,从数组中找到最靠近 x(两数之差最小)的 k 个数.返回的结果必须要是按升序排好的.如果有两个数与 x 的差值一样,优先选择数值较小的那个数. ...
- leetcode 347. Top K Frequent Elements | 347. 前 K 个高频元素(大根堆)
题目 https://leetcode.com/problems/top-k-frequent-elements/ 题解 参考:leetcode 215. Kth Largest Element in ...
- Leetcode - 347. Top K Frequent Elements(堆排序)
Given a non-empty array of integers, return the k most frequent elements. Example 1: Input: nums = [ ...
最新文章
- 一招教你掌握肌肉发力的感觉
- Java 动态写轮眼 SharinganJPanel (整理)
- MySql 创建存储过程
- Android中WebService的应用
- webapi 设置参数可为空_Web API系列(二):灵活多样的路由配置
- 安卓逆向系列教程(二)APK 和 DEX
- 面对 10 亿数据量的挑战,如何对系统进行性能优化?
- ES6基础教程一 学习笔记
- 不用游标遍历数据库执行脚本
- 2019美赛b题:基于Weighted-K-means聚类模型的选址
- php 开发一元夺宝插件,yiyuanyungou 一元云购商城源码,商用 ci框架开发,带指定中奖插件 Other systems 其他 249万源代码下载- www.pudn.com...
- ISO 9001是什么?ISO 9001 质量管理体系详细介绍
- winform打开PDF,显示在窗口
- 单行文本溢出隐藏显示省略号
- 计算机主板cpu插座分类,Intel历代CPU插槽类型、架构、常用主板大全
- WIN10解决“任务管理器被系统管理员禁用”问题
- 超越传统微调!Meta新作VPT:视觉Prompt来了!冻结主干,仅调节1%参数,性能提升显著!...
- 多客户端访问mysql_解决关于多客户端操作数据库并发问题
- 网站推广秘诀二十法(经试验有效,最后有绝招)
- (C语言)输入一行字符,将此字符串中最长的单词输出。