我有一个像{40,78,56,98,1,-9}的数组,这个数组的大小可能很大。我想获取第一个K min元素的索引。我可以使用min-heap / priority-queue获得非常好的时间复杂度的K min个元素。但是我不知道如何获得他们的索引。请以某种方式指导我解决我的问题。
我尝试使用TreeMap获得相同的信息,但是如果数组变大,那将花费太多时间。
示例 输入:{40,78,56,98,1,-9},K = 2 输出:{5,4}
答案 0 :(得分:0)
好吧,我假设您需要执行以下操作:获取给定数组的前2分钟元素的索引。可以通过以下方式实现:
int[] array = {5,75,73,4,78,6,4,3,4,3,64};
// stream the array of integers, box them, sort them by comparing values of their indexes, unbox them, limit only first 2 and get them to array.
int[] getIndexes = IntStream.range(0, array.length).boxed().sorted(Comparator.comparing(i -> array[i])).mapToInt(i->i).limit(2).toArray();
答案 1 :(得分:0)
如果被允许使用优先级队列,则可以通过创建一个类对并在初始化优先级队列的同时传递一个比较器来在优先级队列中添加值和索引。 Pair类可以如下:
class Pair {
Pair(int val, int idx){
this.val = val;
this.idx = idx;
}
int val;
int idx;
}
您可以按以下方式初始化优先级队列:
Queue<Pair> maxHeap = new PriorityQueue<>(k, (pair1, pair2) -> -Integer.compare(pair1.val, pair2.val));