关闭。这个问题需要细节或清晰。它目前不接受答案。
**想改进这个问题吗?**通过编辑这个帖子来添加细节并澄清问题。
上个月关门了。
改进这个问题
两者之间的区别是什么:
PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Collections.reverseOrder());
PriorityQueue<Integer> minHeap = new PriorityQueue<>();
和
PriorityQueue<Integer> maxHeap = new PriorityQueue<>((a, b) -> b - a);
PriorityQueue<Integer> minHeap = new PriorityQueue<>((a, b) -> a - b);
我做了一些leetcode问题,似乎第一个通过的测试用例比下面的多。
1条答案
按热度按时间lx0bsm1f1#
作为一个
compare
功能,a - b
以及b - a
在下列情况下不要给出正确的结果a
以及b
距离太远了。是因为一个叫溢出的小东西。考虑
a - b
,假定的整数的“自然顺序”比较函数。看起来应该有用,对吧?我们来举几个例子:让
a==2
以及b==5
. 自然顺序比较器应该返回一个负数,以表示a < b
.a - b
->2 - 5
->-3
. 量化宽松。让
a==345
以及b==-197
;a > b
,所以我们希望比较器的结果是肯定的。a - b
->245 - (-197)
->245 + 197
->442
. 量化宽松。让
a==100
以及b==100
. 比较器应返回零以指示a == b
.a - b
->100 - 100
-> 0. 量化宽松。到目前为止,还不错,是吗?
现在试试这个:让
a==Integer.MIN_VALUE
(-2_147_483_648)和b==1
. 很明显,a < b
,所以比较器应该返回一个负数。a - b
->-2_147_483_648 - 1
->-2_147_483_649
. qed,对吧?错了!结果实际上是正的2∗147∗483∗647!为什么?溢出,这就是原因。一
int
可以容纳32位,而-2_147_483_649的实际答案需要33位来表示它。实际答案的多余位被丢弃,剩下的32位表示值2_147_483_647。所以我们的compare函数返回一个正结果,从而错误地指出a > b
.