---
# System prepended metadata

title: 658. Find K Closest Elements
tags: [pointer, Leetcode, medium, python, array, c++, sort]

---

###### tags: `Leetcode` `medium` `pointer` `sort` `array` `python` `c++`

# 658. Find K Closest Elements

## [題目連結:] https://leetcode.com/problems/find-k-closest-elements/description/

## 題目:
Given a **sorted** integer array ```arr```, two integers ```k``` and ```x```, return the ```k``` closest integers to ```x``` in the array. The result should also be sorted in ascending order.

An integer ```a``` is closer to ```x``` than an integer ```b``` if:

* ```|a - x| < |b - x|```, or
* ```|a - x| == |b - x|``` and ```a < b```

**Example 1:**
```
Input: arr = [1,2,3,4,5], k = 4, x = 3
Output: [1,2,3,4]
```
**Example 2:**
```
Input: arr = [1,2,3,4,5], k = 4, x = -1
Output: [1,2,3,4]
```

## 解題想法:
* 此題為給一數組，找出數組中離x最近的k個元素
    * 該數組為已排序的

* 使用pointer概念:
    * 每次比較數組頭尾與x的差值
    * 誰距離大，刪除誰
    * 注意: 題目規定，對於|a - x| == |b - x| and a < b，為a比b更近於x，要刪b

* 網上高手解法使用二分法，本人尚未研究請見諒~

## Python:
``` python=
class Solution(object):
    def findClosestElements(self, arr, k, x):
        """
        :type arr: List[int]
        :type k: int
        :type x: int
        :rtype: List[int]
        """
        #因為已排好
        #從左右兩個方向向中間遍歷
        #每次找距離最遠的數字pop
        #最後保留k個
        while len(arr)>k:
            if x-arr[0]<=arr[-1]-x: #右邊距離遠
                arr.pop() #移除右邊
            else:
                arr.pop(0) #移除左邊
        return arr

result=Solution()
ans=result.findClosestElements(arr = [1,2,3,4,5], k = 4, x = 3)
print(ans)
```

## C++:
``` cpp=
#include<bits/stdc++.h>
using namespace std;

class Solution {
public:
    vector<int> findClosestElements(vector<int>& arr, int k, int x) {
        vector<int> res=arr;
        while (res.size()>k){
            if ((x-res.front())<=(res.back()-x))
                res.pop_back();
            else
                res.erase(res.begin());
        }
        return res;
    }
};
```