数组中的 k 个最强值
难度:
标签:
题目描述
代码结果
运行时间: 129 ms, 内存: 27.4 MB
/*
* 思路:
* 1. 先对数组进行排序,然后找到中位数。
* 2. 使用Java Streams进行强度计算和排序。
* 3. 选择前k个元素。
*/
import java.util.*;
import java.util.stream.*;
public class Solution {
public int[] getStrongest(int[] arr, int k) {
// 排序数组以找到中位数
Arrays.sort(arr);
int n = arr.length;
int median = arr[(n - 1) / 2];
// 使用Java Streams进行排序和选择
return Arrays.stream(arr)
.boxed()
.sorted((a, b) -> {
int diffA = Math.abs(a - median);
int diffB = Math.abs(b - median);
if (diffA == diffB) return b - a;
return diffB - diffA;
})
.limit(k)
.mapToInt(i -> i)
.toArray();
}
}
解释
方法:
此题解首先通过对数组进行排序来找到中位数m,然后根据给定的规则(与中位数的绝对差值和元素本身的大小)来确定元素的“强度”。排序后,题解使用了两个指针,从中间向两端扫描,选择最强的k个元素。如果k大于中位数索引m_idx,意味着需要找最弱的元素(实际上就是除去最强的一些元素),所以有一个reverse_flag标志来决定是寻找最强还是最弱的元素。通过比较左右指针指向的元素与中位数的绝对差值大小来决定移动哪一个指针,并记录已选元素个数,直到达到k个。
时间复杂度:
O(n log n)
空间复杂度:
O(n)
代码细节讲解
🦆
在题解中,如何确定何时使用`reverse_flag`以及这一标志位的逻辑基础是什么?
▷🦆
为什么在计算中位数索引时使用`(l - 1) // 2`而不是`l // 2`,尤其在数组长度为偶数时这种计算方式的影响是什么?
▷🦆
在求解最强或最弱元素时,题解中的扫描方法是怎样确保始终能选出`k`个符合条件的元素?
▷