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

leetcode链接:
https://leetcode.cn/problems/find-k-closest-elements/description/

方案一——未完成测试

没完成所有相关测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
int left = 0,
right = arr.length - 1,
mid = 0,
flag = 0,
flag_1 = 0,
arr_size = arr.length - 1;
List<Integer> result = new ArrayList<>();

while (left <= right) {
mid = left + (right - left) / 2;
if (arr[mid] > x) {
right = mid - 1;
} else if (arr[mid] == x) {
break;
} else {
left = mid + 1;
}
}


right = mid - k / 2;
if (right < 0) {
flag = 1;
right = 0;
}
if ((right + k) > arr_size) {
flag = 1;
right = arr_size - k + 1;
if (Math.abs(arr[right] - x) <= Math.abs(arr[right + k -1] - x)) {
right--;
}

}


while (flag == 0) {
if (right < 0 || (right + k) > arr_size || flag_1 > 1 || Math.abs(arr[right] - x) == Math.abs(arr[right + k -1] - x)) {
break;
}
flag_1 = 0;
if (Math.abs(arr[right] - x) > Math.abs(arr[right + k -1] - x)) {
flag_1++;
right++;
}
if (Math.abs(arr[right] - x) < Math.abs(arr[right + k -1] - x)) {
flag_1++;
right--;
}
}

while (true) {
if (right <= 0) {
break;
}
if (arr[right] != arr[--right]) {
right++;
break;
}
}

if (right < 0)
right = 0;

for (int i = 0; i < k; i++) {
result.add(arr[right + i]);
}

return result;

结果

Wrong Answer

  • 47/66 cases passed (N/A)

Testcase

1
2
3
[1,10,15,25,35,45,50,59]
1
30

Answer

1
[35]

Expected Answer

1
[25]

分析

知识没有进行灵活应用

方案二

学习题解相关思想,重新整理思路:
https://leetcode.cn/problems/find-k-closest-elements/solution/zhao-dao-k-ge-zui-jie-jin-de-yuan-su-by-ekwtd/
二分法+双指针

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
int left = 0,
right = arr.length - 1,
mid = 0;
List<Integer> result = new ArrayList<>();
while (left < right) {
mid = left + (right - left) / 2;
if (arr[mid] >= x) {
right = mid;
} else {
left = mid + 1;
}
}

left = right - 1;
while (k-- > 0) {
if (left < 0) {
right++;
} else if (right >= arr.length) {
left--;
} else if (x - arr[left] <= arr[right] - x) {
left--;
} else {
right++;
}
}

for (int i = left + 1; i < right; i++) {
result.add(arr[i]);
}

return result;

结果

  • 66/66 cases passed (3 ms)
  • Your runtime beats 99.62 % of java submissions
  • Your memory usage beats 79.79 % of java submissions (43.1 MB)

较为详细的解题思路

https://leetcode.cn/problems/find-k-closest-elements/solution/pai-chu-fa-shuang-zhi-zhen-er-fen-fa-python-dai-ma/


658. 找到 K 个最接近的元素
http://yuanql.top/2023/04/03/02_leetcode/658. 找到 K 个最接近的元素/
作者
Qingli Yuan
发布于
2023年4月3日
许可协议