48
48
49
49
** 方法一:排序**
50
50
51
- 将 ` arr ` 中的所有元素按照与 ` x ` 的距离从小到大进行排列。取前 ` k ` 个元素排序后返回。
51
+ 将 $ arr$ 中的所有元素按照与 $x$ 的距离从小到大进行排列。取前 $k$ 个元素排序后返回。
52
52
53
- 时间复杂度: $O(nlogn)$。
53
+ 时间复杂度 $O(nlogn)$。
54
54
55
55
** 方法二:双指针**
56
56
57
- 根据 ` arr ` 有序的特点,可以声明头尾指针,然后根据 ` k - arr[left] ` 与 ` arr[right] - k ` 的判断结果缩小范围,直到 ` right - left == k ` ,
57
+ 直觉上,有序数组 $ arr$ 最靠近 $x$ 的 $k$ 个数必然是一段连续的子数组。
58
58
59
- 时间复杂度:$O(n)$。
59
+ 我们可以声明头尾指针,记为 $l$ 和 $r$,然后根据 $x-arr[ l] $ 与 $arr[ r-1] - x$ 的大小比较结果缩小范围,直到 $r - l = k$。
60
+
61
+ 时间复杂度 $O(n)$。
60
62
61
63
** 方法三:二分查找**
62
64
63
- 查找大小为 ` k ` 的所有窗口的左边界 。
65
+ 在方法二的基础上,我们更进一步, 查找大小为 $k$ 的窗口的左边界 。
64
66
65
- 时间复杂度: $O(logn)$。
67
+ 时间复杂度 $O(logn)$。
66
68
67
69
<!-- tabs:start -->
68
70
73
75
``` python
74
76
class Solution :
75
77
def findClosestElements (self , arr : List[int ], k : int , x : int ) -> List[int ]:
76
- arr.sort(key = lambda v : ( abs (v - x), x))
78
+ arr.sort(key = lambda v : abs (v - x))
77
79
return sorted (arr[:k])
78
80
```
79
81
82
+ ``` python
83
+ class Solution :
84
+ def findClosestElements (self , arr : List[int ], k : int , x : int ) -> List[int ]:
85
+ l, r = 0 , len (arr)
86
+ while r - l > k:
87
+ if x - arr[l] <= arr[r - 1 ] - x:
88
+ r -= 1
89
+ else :
90
+ l += 1
91
+ return arr[l: r]
92
+ ```
93
+
80
94
``` python
81
95
class Solution :
82
96
def findClosestElements (self , arr : List[int ], k : int , x : int ) -> List[int ]:
@@ -108,6 +122,26 @@ class Solution {
108
122
}
109
123
```
110
124
125
+ ``` java
126
+ class Solution {
127
+ public List<Integer > findClosestElements (int [] arr , int k , int x ) {
128
+ int l = 0 , r = arr. length;
129
+ while (r - l > k) {
130
+ if (x - arr[l] <= arr[r - 1 ] - x) {
131
+ -- r;
132
+ } else {
133
+ ++ l;
134
+ }
135
+ }
136
+ List<Integer > ans = new ArrayList<> ();
137
+ for (int i = l; i < r; ++ i) {
138
+ ans. add(arr[i]);
139
+ }
140
+ return ans;
141
+ }
142
+ }
143
+ ```
144
+
111
145
``` java
112
146
class Solution {
113
147
public List<Integer > findClosestElements (int [] arr , int k , int x ) {
@@ -152,13 +186,29 @@ public:
152
186
};
153
187
```
154
188
189
+ ``` cpp
190
+ class Solution {
191
+ public:
192
+ vector<int > findClosestElements(vector<int >& arr, int k, int x) {
193
+ int l = 0, r = arr.size();
194
+ while (r - l > k) {
195
+ if (x - arr[ l] <= arr[ r - 1] - x) {
196
+ --r;
197
+ } else {
198
+ ++l;
199
+ }
200
+ }
201
+ return vector<int >(arr.begin() + l, arr.begin() + r);
202
+ }
203
+ };
204
+ ```
205
+
155
206
```cpp
156
207
class Solution {
157
208
public:
158
209
vector<int> findClosestElements(vector<int>& arr, int k, int x) {
159
210
int left = 0, right = arr.size() - k;
160
- while (left < right)
161
- {
211
+ while (left < right) {
162
212
int mid = (left + right) >> 1;
163
213
if (x - arr[mid] <= arr[mid + k] - x) right = mid;
164
214
else left = mid + 1;
@@ -192,6 +242,20 @@ func abs(x int) int {
192
242
}
193
243
```
194
244
245
+ ``` go
246
+ func findClosestElements (arr []int , k int , x int ) []int {
247
+ l , r := 0 , len (arr)
248
+ for r-l > k {
249
+ if x-arr[l] <= arr[r-1 ]-x {
250
+ r--
251
+ } else {
252
+ l++
253
+ }
254
+ }
255
+ return arr[l:r]
256
+ }
257
+ ```
258
+
195
259
``` go
196
260
func findClosestElements (arr []int , k int , x int ) []int {
197
261
left , right := 0 , len (arr)-k
@@ -209,16 +273,14 @@ func findClosestElements(arr []int, k int, x int) []int {
209
273
210
274
### ** Rust**
211
275
212
- 双指针:
213
-
214
276
``` rust
215
277
impl Solution {
216
278
pub fn find_closest_elements (arr : Vec <i32 >, k : i32 , x : i32 ) -> Vec <i32 > {
217
279
let n = arr . len ();
218
280
let mut l = 0 ;
219
281
let mut r = n ;
220
282
while r - l != k as usize {
221
- if ( arr [l ] - x ) . abs () <= ( arr [r - 1 ] - x ) . abs () {
283
+ if x - arr [l ] <= arr [r - 1 ] - x {
222
284
r -= 1 ;
223
285
} else {
224
286
l += 1 ;
@@ -249,6 +311,39 @@ impl Solution {
249
311
}
250
312
```
251
313
314
+ ### ** TypeScript**
315
+
316
+ ``` ts
317
+ function findClosestElements(arr : number [], k : number , x : number ): number [] {
318
+ let l = 0 ;
319
+ let r = arr .length ;
320
+ while (r - l > k ) {
321
+ if (x - arr [l ] <= arr [r - 1 ] - x ) {
322
+ -- r ;
323
+ } else {
324
+ ++ l ;
325
+ }
326
+ }
327
+ return arr .slice (l , r );
328
+ }
329
+ ```
330
+
331
+ ``` ts
332
+ function findClosestElements(arr : number [], k : number , x : number ): number [] {
333
+ let left = 0 ;
334
+ let right = arr .length - k ;
335
+ while (left < right ) {
336
+ const mid = (left + right ) >> 1 ;
337
+ if (x - arr [mid ] <= arr [mid + k ] - x ) {
338
+ right = mid ;
339
+ } else {
340
+ left = mid + 1 ;
341
+ }
342
+ }
343
+ return arr .slice (left , left + k );
344
+ }
345
+ ```
346
+
252
347
### ** ...**
253
348
254
349
```
0 commit comments