题目:

给定一个 排序好 的数组 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/problems/find-k-closest-elements
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

结果:

解题思路:

首先找到数组中最靠近x的值。因为后面是计算开始的值,start是记录left的,所以这里如果没有等于x的,则取比x大一个的那个值。

这样,下一个循环的时候,如果比x小的最大的那个值距离x更近,则会start 左移。始终保持start的位置是我们要记录的最开始的位置。

最后就按照start的位置开始k个数值都放到返回数组里就好了。

代码:

/*** Note: The returned array must be malloced, assume caller calls free().*/
int* findClosestElements(int* arr, int arrSize, int k, int x, int* returnSize){int *retArr = (int *)malloc(sizeof(int) * k);* returnSize = k;// 找到最接近x的值,如果没有==x的,就取第一个比x大的值int mid = 0;for (; mid < arrSize - 1; mid++) {if (arr[mid] == x) {break;} else if (arr[mid] < x && arr[mid + 1] > x) {mid++;break;} else if (arr[mid] > x) {break;}}int right, left;if (mid == 0) {left = mid;right = mid + 1;} else {left = mid - 1;right = mid;}// 通过循环找到需要我们记录的连续数据的最开始那个下标int start = mid;for (int i = 0; i < k; i ++) {if (left < 0) {break;} else if (right >= arrSize) {start = left--;} else if(left >= 0 && abs(arr[left] - x) < abs(arr[right] - x)) {start = left--;} else if (arr[left] < arr[right] && abs(arr[left] - x) == abs(arr[right] - x)) {start = left--;} else {right++;}}for (int i = 0; i < k; i++) {retArr[i] = arr[start + i];}return retArr;
}

C练题笔记之:Leetcode-658. 找到 K 个最接近的元素相关推荐

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

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

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

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

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

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

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

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

  5. LeetCode 每日一题——658. 找到 K 个最接近的元素

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

  6. 【LeetCode通关全记录】658. 找到 K 个最接近的元素

    [LeetCode通关全记录]658. 找到 K 个最接近的元素 题目地址

  7. 【658. 找到 K 个最接近的元素】

    来源:力扣(LeetCode) 描述:    给定一个 排序好 的数组 arr ,两个整数 k 和 x ,从数组中找到最靠近 x(两数之差最小)的 k 个数.返回的结果必须要是按升序排好的. 整数 a ...

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

    给定一个 排序好 的数组 arr ,两个整数 k 和 x ,从数组中找到最靠近 x(两数之差最小)的 k 个数.返回的结果必须要是按升序排好的. 整数 a 比整数 b 更接近 x 需要满足: |a - ...

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

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

最新文章

  1. 【Matlab 控制】绘制盖尔圆
  2. 读书(附电子书)|小狗钱钱之白色的拉布拉多
  3. python 创建文件_Python入学首次项目,新手必看,简单易操作
  4. 线性代数四之动态DP(广义矩阵加速)——Can you answer these queries III,保卫王国
  5. 自定义Valid注解,校验List集合
  6. make install到指定安装目录
  7. windows自动设置ip地址脚本
  8. Citrix入门教程,之windows server2008 r2安装
  9. OllyDBG 入门
  10. 文章自动采集重新组合工具
  11. 最新计算机二级c语言程序设计题库,计算机二级C语言编程题库(100题
  12. 怎样用一个鼠标和键盘控制两台电脑
  13. SNIFFER(嗅探器)-简介(zt)
  14. js生成二维码附带logo
  15. 解决移动端点击响应速度慢的问题tap
  16. 实景化数字城市共享信息平台
  17. 方差分析表和回归分析表的那些浆糊糊
  18. idea各种中文乱码问题
  19. EDM电子邮件营销策划常用创意
  20. 转:R语言在已有图形上面添加一条直线

热门文章

  1. [深度学习论文笔记]UNETR: Transformers for 3D Medical Image Segmentation
  2. signature=c9c5777d3c4d3f66a24e97c3454c1093,DETECTING OBJECTS IN VIDEO DATA
  3. i5 12400f配什么显卡
  4. Codeforces Round #655 (Div. 2) C
  5. Linux安装部署DM8详细步骤与问题解决
  6. Chrome浏览器下载与设置
  7. 专有网VPC---使用
  8. 星起航:维护好私域流量池要有哪些要素?
  9. 【Matlab】利用贝叶斯网络工具箱中的K2算法进行结构学习
  10. Temu跨境电商,自养国外买家账号补单?快速出单,掌握流量密码