我指的是这个博客上列出的代码:https://strstr.io/Leetcode1054-Distant-Barcodes/
我在这里复制这段代码
class Solution {
public int[] rearrangeBarcodes(int[] barcodes) {
if(barcodes == null || barcodes.length == 0)
return new int[0];
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for(int i: barcodes)
map.put(i, map.getOrDefault(i, 0) + 1);
PriorityQueue<Map.Entry<Integer, Integer>> pq = new PriorityQueue<Map.Entry<Integer, Integer>>(
(a,b)->b.getValue()-a.getValue() == 0?a.getKey() - b.getKey(): b.getValue() - a.getValue());
for(Map.Entry<Integer, Integer> entry:map.entrySet())
pq.offer(entry);
int[] res = new int[barcodes.length];
int i = 0;
while(!pq.isEmpty()) {
int k = 2;
List<Map.Entry> tempList = new ArrayList<Map.Entry>();
while(k > 0 && !pq.isEmpty()) {
Map.Entry<Integer, Integer> head = pq.poll();
head.setValue(head.getValue() - 1);
res[i++] = head.getKey();
tempList.add(head);
k--;
}
for(Map.Entry<Integer, Integer> e: tempList) {
if(e.getValue() > 0)
pq.add(e);
}
if(pq.isEmpty())
break;
}
return res;
}
}
我试图理解的代码在这里
PriorityQueue<Map.Entry<Integer, Integer>> pq = new PriorityQueue<Map.Entry<Integer, Integer>>(
(a,b)->b.getValue()-a.getValue() == 0?a.getKey() - b.getKey(): b.getValue() - a.getValue());
我从这段代码中得到的是PriorityQueue
是用比较器构建的。值
a
和b
是正在比较的两个值。现在
为什么a
和b
之间的差异被比作0?为什么不
〈守则〉(a, b)─
这在你的问题中意味着什么?让我们看看。首先,回想一下Java的PriorityQueue作为一个min-heap,根据它被给定的比较器;也就是说,拉出的第一个元素是这样的,elem.compareTo(其他)为PriorityQueue中的任何其他元素返回-1或0。我们可以使用它来确定哪些元素将是第一个从PriorityQueue中提取的元素。
这里有一些情况:
a.getValue()==b.getValue()
:我们评估a.getKey()-b.getKey()
a.getKey()==b.getKey()
a.getValue()
当我们把这一切放在一起,这一切意味着什么?表达式
(a, b)-
如果以下“条形码”:“条形码频率”对位于PriorityQueue内
1:2
2:4
3:2
4:1
它们将按以下顺序提取:
2:4, 1:2, 3:2, 4:1
此外,为了澄清为什么他们将
a
和b
与0进行比较,他们没有。相反,他们正在比较b.getValue()-a.getValue()==0
。将a.getValue()
添加到方程的两侧,我们得到b.getValue()==a.getValue()
。本质上,他们是在测试这些值是否相等,而不是这些值是否为0。
我正在将边添加到PriorityQueue,但由于某些原因,它们没有按其值进行排序,从而导致以后出现错误的结果。 我的边缘班是这样的 然而,当我运行我的代码,在属于节点“Springfield,MO”的LinkedList中将所有内容添加到PriorityQueue时,边按错误的顺序排序,如下图所示,问题是什么? 我尝试为Edge创建一个特定的比较器类,并将其用作PriorityQueue中的参数
我试图解决以下leetcode问题: 给定一个排序数组,两个整数k和x,查找数组中与x最近的k个元素。结果也应该按升序排序。如果有一个领带,较小的元素总是首选。 示例1:输入:[1,2,3,4,5],k=4,x=3 产出:[1,2,3,4] 示例2:输入:[1,2,3,4,5],k=4,x=-1 产出:[1,2,3,4] 目前我的错误解决方案如下: 问题在于我传递给构造函数的比较器。其思想是,我希
在我的PriorityQueue中,我有两种类型的客户,即VIP和常规客户。我想先为贵宾服务,再为常客服务。 如果CustomerID<100,则视为VIP。 如果客户是VIP,他会排在队列中VIP部分的最后 更新:我不想排序任何其他列除了VIP。我不想添加“日期”,因为它感觉像是一个黑客,而不是理解Java是如何工作的。
我尝试用降序的内部比较器类实现优先级队列,但是当我打印优先级队列时,我没有得到正确的结果。当我尝试收集相同的比较器代码时。排序以实现列表的排序(使用相同的值)。我得到了正确的结果。你能解释一下吗? 上述代码的答案是pq值为[50,40,20,10,30] 以上代码的答案是数组值为:[50,40,30,20,10]
在React的这篇文档中,据说 shallowCompare对current props和nextProps对象以及current state和nextState对象执行浅层相等性检查。 我无法理解的是,如果它简单地比较了对象,那么componentupdate方法应该总是返回true,就像 如果我们没有改变状态,那么比较将始终返回false,因此shouldComponent更新将始终返回tru
问题内容: 我一直在阅读编程书,作者展示了一个类似的示例: 所以,我想知道为什么为什么等于假?如何比较这两个元组? 顺便说一句,这本书没有解释。 问题答案: 比较元组的位置:将第一元组的第一项与第二元组的第一项进行比较;如果它们不相等(即第一个大于或小于第二个),则这是比较的结果,否则将考虑第二个,然后是第三个,依此类推。 请参阅常见序列操作: 相同类型的序列也支持比较。特别是,通过比较相应的元素