LeetCode刷题系列 -- 658. 找到 K 个最接近的元素
admin
2024-05-21 10:37:28
0

题目

给定一个 排序好 的数组 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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-k-closest-elements
 

思路:

1. 使用二分法查找目标 x 在数组中应该插入的位置 index, 此时说明:要求的k个数在 下标为 index - k +1 到  index + k -1 之间
2. 利用双指针:令 left = index - k +1, right = index + k -1;
3. 当 right - left + 1 > k 时,如果 abs (nums[left] - x) > abs(nums[right] - x), 则左边界右移;如果 abs (nums[left] - x) <= abs(nums[right] - x), 则右边界左移;直到 right - left + 1 == k 为止

java代码如下:

class Solution {public List findClosestElements(int[] arr, int k, int x) {int left = 0;int right = arr.length - 1;while (left < right) {int mid = left + (right - left) / 2;if (arr[mid] < x) {left = mid + 1;} else {right = mid;}}int x_index = left;int left_index = Math.max(x_index - k, 0);int right_index = Math.min(x_index + k, arr.length - 1);while (right_index - left_index + 1> k) {if (Math.abs(x - arr[left_index]) > Math.abs(x - arr[right_index])) {left_index++;} else {right_index--;}}List result = new ArrayList<>();for (int i = left_index; i <= right_index; i++) {result.add(arr[i]);   }return result;}
}

c++

class Solution {
public:vector findClosestElements(vector& arr, int k, int x) {int L = 0;int R = arr.size() - 1;while(L < R) {int mid = L + (R - L)/2;if(arr[mid] < x) {L = mid + 1;} else {R = mid;}}int left = (R-k)>=0 ? (R-k):0;int right = (R+k) <= (arr.size()-1)? (R+k):(arr.size()-1);while(right - left + 1 > k) {int left_v = (x - arr[left]) >= 0 ? (x - arr[left]) : (arr[left] - x);int right_v = (x - arr[right]) >= 0 ? (x - arr[right]) : (arr[right] - x);// 当 abs (arr[left] - x) == abs(arr[right] - x) 时,此时应该保留更小的 arr[left] , 即将 right 左移if(left_v <= right_v) {right--;} else {left++;}}vector result;for(int i=left;i<=left+k-1;i++) {result.emplace_back(arr[i]);}return result;}
};

相关内容

热门资讯

和尚敲钟三更起什么意思 和尚敲钟三更起什么意思佛教的早课一般在凌晨2.3点钟起来,念经,念佛。。。。。。。。。。。。和尚敲钟...
单腿鹅的故事说明了什么道理 单腿鹅的故事说明了什么道理告诉我们的道理是嫉妒这个东西,害处十分大。我们一定要从小克服它,过好自己的...
人如其名是什么意思? 人如其名是什么意思?“人如其名”是一句谚语,意为一个人的名字与他的个性、性格和特点相对应。人们普遍认...
MP3内部问题 MP3内部问题记住要用 MP3 格式化盘来格式化 否则对机器本身不好 有可能使MP3芯片坏掉!本人...
有一种想念叫做望眼欲穿。这句话... 有一种想念叫做望眼欲穿。这句话是什么意思啊?1、比喻非常想念或想见到一个人的心情。2、这是一种极其迫...
家的,N次方 什么叫幸福?我想... 家的,N次方 什么叫幸福?我想知道这句话的含义 谢谢 急急急急n次方,说明的是这个数很大,寓意家庭中...
推荐点古风歌曲类似倾尽天下和天... 推荐点古风歌曲类似倾尽天下和天下这类的喜欢倾尽天下和天下那种大气的古风,很有那种武侠范儿,最好不推荐...
对爱人超级宠爱,是真正的暖男的... 对爱人超级宠爱,是真正的暖男的星座你知道有哪些吗?应该就是双子座白羊座和处女座的男生,因为他们能够给...
怎么写书 怎么写书写作是一个很庞大的领域,这个领域有不同的分支,所以你要先想好自己适合写什么风格类型的,并且先...
狼的典故,狼的典故有哪些?​ 狼的典故,狼的典故有哪些?​狼的典故有哪些?《狼来了》、《小红帽》、蒲松龄的《狼》
给孩子上户口是一件很麻烦的事么... 给孩子上户口是一件很麻烦的事么?怎么上?如题:给孩子上户口是一件很麻烦的事么?怎么上?只要你们有户口...
请问,欧陆风云秘籍怎么输入,请... 请问,欧陆风云秘籍怎么输入,请大家指点(那个改键盘输入为英国的方法,不得~~或者是我不会用)?请大家...
郭静新专辑有哪些歌?还有在树上... 郭静新专辑有哪些歌?还有在树上唱歌那张专辑有哪些歌…同上新专辑有《嫁妆》,《每一天都不同》,物没《聊...
原创 美... 2025年的盛夏,北京、上海、广州三城夜幕下,一场由美团、阿里、京东三巨头引发的外卖补贴大战,将奶茶...
蒸扣碗怎么蒸好吃,蒸扣碗肉的家... 蒸扣碗的美味秘诀与家常做法大全 一、核心技巧:决定成败的3个关键点 去腥增香三件套 冷水焯...
入夏后最受欢迎的8道家常快手菜... 入夏后,人们更倾向于选择清淡、快速且营养丰富的家常快手菜,以适应炎热天气带来的食欲变化。根据我搜索到...
原创 每... “从手到口,从口到心,中国人延续着对世界和人生特有的感知方式。只要点起炉火,端起碗筷,每个平凡的人,...
2025“必吃嘉年华”首落重庆... 7月11日至13日,由渝中区商务委联合美团引入2025大众点评“必吃嘉年华”落地重庆天地。 “必吃...
“食”尚方庄 品味南城 202... 人民网北京7月13日电(记者鲍聪颖)潮饮体验、美食甄选、文创潮玩……7月12日,首届“食”尚方庄 品...
极地精灵暑期限定!苏州迎来一批... 现代快报讯(记者 高达)经过长途跋涉,一群来自吉林长春的特殊“客人”——巴布亚企鹅,已于近日顺利抵达...