使用 heappop() 的代码可以正常工作,但是当使用数组表示时它不起作用

code using heappop() is working but when using array representation its not working

这是一个我一直在研究的 leetcode 问题 https://leetcode.com/problems/last-stone-weight/ ,代码似乎接受使用以下代码片段

   a= heapq.heappop(stones1);
   b= heapq.heappop(stones1);
   heapq.heappush(stones1,a-b);

但是当它被使用时它似乎不起作用,

   a=stones1[0];
   b=stones1[1];
   heapq.heappop(stones1);
   heapq.heappop(stones1);
   heapq.heappush(stones1,a-b);

这两个代码代表的不是同一个东西吗?

有了工作代码...

a= heapq.heappop(stones1);
b= heapq.heappop(stones1);

...ab 代表堆中的最小值和 one-but-least 值(就像在开始提取之前一样)。

没错,最小值总是位于堆中的索引 0 处,所以这是正确的:

a=stones1[0];
heapq.heappop(stones1);

但是,并非 值总是位于堆中的索引 1 处 one-but-least。它可能位于索引 2。所以这并不总是正确的:

a=stones1[0];
b=stones1[1];
heapq.heappop(stones1);
heapq.heappop(stones1);

这是一个堆的可视化示例:

              1
             / \
            3   2

在列表表示中,这是 [1, 3, 2]

执行heapq.heappop(stones1)后,这个列表变成[2, 3]。所以现在 b 中你想要的值已经从索引 2 移动到索引 0。它会在再次执行 heapq.heappop(stones1) 时弹出。