通过万岁!!!
- 题目:给你一个有序的数组,然后从这个数组中,找k个数,是离x最近的的,并且这k个数也是排好序的进行返回。
- 思路:就是我们先找到x应该在的位置,找到以后,用双指针往左右两边移动。每次选择两个中减去x以后绝对值最小的一个加入列表。由于列表需要头插和尾插,因此最好是LinkedList。
- 技巧:数组的遍历,链表。
java代码
class Solution {
public List<Integer> findClosestElements(int[] arr, int k, int x) {
List<Integer> ans = new LinkedList<>();
int r = 0;
int len = arr.length;
for (int i = 0; i < len; i++) {
r = i;
if (arr[i] >= x) {
break;
}
}
int l = r - 1;
while (ans.size() < k && l >= 0 && r < len) {
if (Math.abs(arr[l] - x) > Math.abs(arr[r] - x)) {
ans.add(arr[r++]);
} else {
ans.add(0, arr[l--]);
}
}
if (ans.size() == k) {
return ans;
} else if (l >= 0) {
while (ans.size() < k) {
ans.add(0, arr[l--]);
}
return ans;
} else {
while (ans.size() < k) {
ans.add(arr[r++]);
}
return ans;
}
}
}
- 总结:题目不是特别难,并且需要注意的是数据结构的选择,如果选择ArrayList,则耗时还是比较多的。其实最好感觉应该用双端循环队列。