Skip to content

Commit 2fbe5bf

Browse files
authored
Create merge_number.py
1 parent f73c15f commit 2fbe5bf

File tree

1 file changed

+54
-0
lines changed

1 file changed

+54
-0
lines changed

merge_number.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
class Solution:
2+
"""
3+
@param numbers: the numbers
4+
@return: the minimum cost
5+
"""
6+
def mergeNumber(self, numbers):
7+
# Write your code he
8+
"""
9+
可以证明从最小的数开始加,
10+
和的话送回到队列重新排序,
11+
排序比较慢,所以做个最小堆。
12+
"""
13+
ret = 0
14+
heap = Heap(numbers)
15+
while len(heap.data) > 1:
16+
a = heap.pop()
17+
b = heap.data[0]
18+
ret += (a + b)
19+
heap.data[0] = (a + b)
20+
heap.adjustDown(0)
21+
return ret
22+
23+
24+
class Heap:
25+
def __init__(self, numbers):
26+
self.data = numbers
27+
for i in range(int((len(self.data) - 1) / 2), -1, -1):
28+
self.adjustDown(i)
29+
30+
def adjustDown(self, i):
31+
data = self.data
32+
while i < len(data):
33+
left, right = i * 2 + 1, i * 2 + 2
34+
min_pos = i
35+
if (left < len(data)) and (data[left] < data[min_pos]):
36+
min_pos = left
37+
if (right < len(data)) and (data[right] < data[min_pos]):
38+
min_pos = right
39+
if min_pos != i:
40+
data[i], data[min_pos] = data[min_pos], data[i]
41+
i = min_pos
42+
else:
43+
break
44+
45+
def pop(self):
46+
ret = self.data[0]
47+
self.data[0], self.data[-1] = self.data[-1], self.data[0]
48+
self.data.pop()
49+
if not self.empty():
50+
self.adjustDown(0)
51+
return ret
52+
53+
def empty(self):
54+
return len(self.data) == 0

0 commit comments

Comments
 (0)