Re: [闲聊] 每日LeetCode

楼主: Rushia (みけねこ的鼻屎)   2022-09-29 10:22:39
658. Find K Closest Elements
说明:
给定一个排序好的阵列arr、一个数字k和一个数字x,我们需返回一个大小为k的列表,
其中的数字要是最接近x的数字,若数字一样接近则数字小的优先,返回的列表必须也是
排序好的。
Example 1:
Input: arr = [1,2,3,4,5], k = 4, x = 3
Output: [1,2,3,4]
法一 Heap+暴力法
思路:
1.把所有数字都丢进min heap,绝对值小的排最前面,绝对值一样则比较本身的值
2.从heap中取出k个值放入列表
3.排序列表
Java Code:
class Solution {
public List<Integer> findClosestElements(int[] arr, int k, int x) {
List<Integer> res = new ArrayList<>();
PriorityQueue<int[]> queue = new PriorityQueue<>((a,b) ->
a[0] != b[0] ? a[0] - b[0] : a[1] - b[1]
);
for (int n : arr)
queue.offer(new int[]{Math.abs(x - n), n});
for(int i = 0; i < k; i++)
res.add(queue.poll()[1]);
res.sort(Comparator.naturalOrder());
return res;
}
}
时间复杂度:O(nlogn + k + klogk)
法二 双指标
思路:
1.取出k个最接近的数之问题等同于从原阵列删除 n - k个数,又对于某数x来说距离
最远的数只能是最左边的数或最右边的数。
2.比较阵列的最左和最右元素,维护两个指标,指标不交集的范围表示被删除,每次都
删除绝对值较大的,若相等则优先删除右边。
3.把指标start到end范围的数存入List返回。
Java Code:
class Solution {
public List<Integer> findClosestElements(int[] arr, int k, int x) {
List<Integer> res = new ArrayList<>();
int n = arr.length, start = 0, end = n - 1;
for(int i = 0; i < n - k; i++) {
int diff1 = Math.abs(x - arr[start]);
int diff2 = Math.abs(x - arr[end]);
if(diff1 > diff2) start++;
else end
作者: Ericz7000 (Ericz7000nolan)   2022-09-29 10:26:00
聪明
楼主: Rushia (みけねこ的鼻屎)   2022-09-29 10:26:00
帮内推
作者: KusanagiYuma (草薙由麻)   2022-09-29 10:27:00
大师,求carry
作者: pandix (面包屌)   2022-09-29 10:33:00
大师
作者: JerryChungYC (JerryChung)   2022-09-29 12:21:00
大师

Links booklink

Contact Us: admin [ a t ] ucptt.com