为了好玩/Java实践,我做了以下问题:
编写一个方法,该方法将整数的优先级队列作为输入,并输出最小整数。该方法不应更改传入的优先级队列的内部状态。您只能使用一个队列或堆栈作为额外数据。不允许使用其他数据结构<代码>k为1索引(k=1
表示最小值)。
获取kth
元素很简单:只需删除k
次,因为它是优先级队列。我想我可以弹出,将元素放在堆栈上进行存储,然后在完成后将它们添加回队列。不过这不起作用,因为元素在优先级队列中的顺序不同。
以下是我的好奇心代码:
public int kthSmallest(PriorityQueue<Integer> pq, int k) {
Stack<Integer> s = new Stack<Integer>();
for (int i = 1; i <= k; ++i) {
s.push(pq.remove());
}
int kthValue = s.peek();
while (!s.empty()) {
pq.add(s.pop());
}
return kthValue;
}
那么,如何在保持优先级队列的内部状态的同时做到这一点呢?
P、 你可以自己在这里查看问题
许多提示已经陈述,我会保持我的回答简短:
您正在处理来自给定对象的方法调用,而您对此一无所知。你不知道是否使用了一个奇怪的比较器来比较队列中的整数(例如,一个表示所有事物都相等并且总是返回0的比较器)。这就是为什么在任何情况下都不应该修改给定对象(就像使用轮询/添加一样)。
在这种情况下,为了解决这个问题,您可以使用缓冲区对象(如问题中所述,队列或堆栈(我使用了与给定队列类似的队列)来使用您选择的比较器,并通过将给定队列添加到缓冲区对象来缓冲它。
我在pastebin的解决方案,因为我没有任何扰流板标签:-(
你为什么要搬走?不需要修改传入的数据结构,这就是算法失败的原因。这只不过是一个迭代器/访问者。您只需遍历队列并维护一个最小数字的列表/数组。
还要注意,您认为队列中第k个最小整数与优先级中删除的数字相同的假设不一定正确。优先级队列!=堆在这个例子中,我可能有一个整数的优先级队列,每个整数都有一个优先级字段。
class Node<Integer>
Integer data;
int priority;
}
class PriorityQueue {
List<Node> nodes;
Integer getHighestPriority() {
int maxPriorityIndex = 0;
for(int i=0; i< nodes.size(); i++) {
if(n.priority > maxPriority) {
maxPriorityIndex = nodes.get(i);
}
return nodes.get(maxPriorityIndex);
}
}
关于底层状态,您无法保证任何东西:优先级队列(PriorityQueue)唯一的顺序概念是由您在创建它时指定的比较器(或其元素的自然顺序)提供的。作为用户,您对此一无所知,只要队列的行为符合基于其规范的预期,那么元素的存储方式就不会有任何区别。
这是一个面试问题。 在具有排序行和列的矩阵中找到Kth最小元素。 Kth最小元素是中的一个,例如,这是否正确?
我的问题是受到这个特殊的SO评论的启发,这个评论没有得到回答(我自己也面临这个问题): 我试图找到排序矩阵中第K个最小的元素: 给定一个nxn矩阵,其中每个行和列都按升序排序,返回矩阵中第k个最小的元素 请注意,它是排序顺序中的第k个最小元素,而不是第k个独立元素 输入:矩阵=[[1,5,9],[10,11,13],[12,13,15],[12,13,15],k=8 输出:13 说明:矩阵中的元素
我目前正在研究选择算法,即中位数。 我遇到了下面两个句子: 在计算机科学中,选择算法是寻找列表或数组中第k个最小数的算法; 在计算机科学中,中位数是一种近似(中位数)选择算法,经常用于为精确选择算法(主要是quickselect)提供良好的中枢,该算法选择最初未排序数组的第k个最大元素。 第k个最小/最大元素是什么意思?为了使问题更具体一点,考虑以下(未排序)数组: 例如,第五小的元素是什么?第五
所以我正在研究一个Leetcode问题,我的代码在某些情况下有效,但在某些情况下失败。 问题是: 给定一个矩阵,其中每个行和列都按升序排序,找出矩阵中第k个最小的元素。 请注意,它是排序顺序中的第k个最小元素,而不是第k个独立元素。 例子: 返回: 13 我的方法是使用minHeap,即使它声明数组已经排序,我仍然需要确保我已经将它从最小值排序到最大值。 这是我的代码: 以下是我的意见: 以下是输
这可能是微软的面试问题。 从排序的数组中找出第k个最小的元素(忽略重复项) [编辑]:数组可能包含重复项(未指定)。 想了很多次,但仍然质疑自己:还有更好的解决方案吗? 取最大堆 时间复杂度:O(NlogK) 空间复杂度:O(K) 这些元素可能是重复的。所以,通过与以前的元素进行比较来检查是否有唯一的元素 还可以使用改进版的快速排序分区算法。但它可能会导致最坏的情况,因为数组已经排序<这里出现了两
我有一个堆(像二叉树一样实现:每个节点都有两个指向子节点的指针和一个指向父节点的指针)。 给定第k个元素的元素数量,我如何找到它(以BFS顺序)?我认为这可以在O(logn)时间内完成。。