Skip to content

Commit c0bb406

Browse files
committed
add: 1046.最后一块石头的重量
1 parent 6662666 commit c0bb406

File tree

2 files changed

+149
-0
lines changed

2 files changed

+149
-0
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,7 @@
247247
###
248248

249249
- [x] [【day-54】215.数组中的第 K 个最大元素](./medium/heap/54.kth-largest-element-in-an-array.md)
250+
- [x] [【day-55】1046.最后一块石头的重量](./medium/heap/55.last-stone-weight.md)
250251
- [x] [【day-56】23.合并K个升序链表](./medium/heap/56.merge-k-sorted-lists.md)
251252
- [x] [【day-57】451.根据字符出现频率排序](./medium/heap/57.sort-characters-by-frequency.md)
252253
- [x] [【day-58】378. 有序矩阵中第K小的元素](./medium/heap/58.kth-smallest-element-in-a-sorted-matrix.md)
Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
# 1046. 最后一块石头的重量
2+
3+
https://leetcode-cn.com/problems/last-stone-weight/
4+
5+
- [1046. 最后一块石头的重量](#1046-最后一块石头的重量)
6+
- [题目描述](#题目描述)
7+
- [方法1:大顶堆](#方法1大顶堆)
8+
- [思路](#思路)
9+
- [复杂度分析](#复杂度分析)
10+
- [代码](#代码)
11+
12+
## 题目描述
13+
14+
```
15+
有一堆石头,每块石头的重量都是正整数。
16+
17+
每一回合,从中选出两块 最重的 石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:
18+
19+
如果 x == y,那么两块石头都会被完全粉碎;
20+
如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。
21+
最后,最多只会剩下一块石头。返回此石头的重量。如果没有石头剩下,就返回 0。
22+
23+
 
24+
25+
示例:
26+
27+
输入:[2,7,4,1,8,1]
28+
输出:1
29+
解释:
30+
先选出 7 和 8,得到 1,所以数组转换为 [2,4,1,1,1],
31+
再选出 2 和 4,得到 2,所以数组转换为 [2,1,1,1],
32+
接着是 2 和 1,得到 1,所以数组转换为 [1,1,1],
33+
最后选出 1 和 1,得到 0,最终数组转换为 [1],这就是最后剩下那块石头的重量。
34+
 
35+
36+
提示:
37+
38+
1 <= stones.length <= 30
39+
1 <= stones[i] <= 1000
40+
41+
来源:力扣(LeetCode)
42+
链接:https://leetcode-cn.com/problems/last-stone-weight
43+
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
44+
```
45+
46+
## 方法1:大顶堆
47+
48+
### 思路
49+
50+
直接用大顶堆来模拟粉碎石头的游戏。
51+
52+
### 复杂度分析
53+
54+
- 时间复杂度:$O(nlogn)$,n 是数组大小,最坏的情况是,每回合粉碎两块石头之后,都有一颗新的小石头生成。
55+
- 空间复杂度:$O(n)$,n 是数组大小。
56+
57+
### 代码
58+
59+
JavaScript Code
60+
61+
```js
62+
/**
63+
* @param {number[]} stones
64+
* @return {number}
65+
*/
66+
var lastStoneWeight = function(stones) {
67+
const heap = new MaxHeap(stones);
68+
69+
while (heap.size() > 1) {
70+
const first = heap.pop();
71+
const second = heap.pop();
72+
if (first > second) heap.insert(first - second)
73+
}
74+
return heap.size() ? heap.pop() : 0;
75+
};
76+
77+
// **************************************************
78+
79+
class Heap {
80+
constructor(list = [], comparator) {
81+
this.list = list;
82+
this.comparator = comparator;
83+
84+
this.init();
85+
}
86+
87+
init() {
88+
const size = this.size();
89+
for (let i = Math.floor(size / 2) - 1; i >= 0; i--) {
90+
this.heapify(this.list, size, i);
91+
}
92+
}
93+
94+
insert(n) {
95+
this.list.push(n);
96+
const size = this.size();
97+
for (let i = Math.floor(size / 2) - 1; i >= 0; i--) {
98+
this.heapify(this.list, size, i);
99+
}
100+
}
101+
102+
peek() {
103+
return this.list[0];
104+
}
105+
106+
pop() {
107+
const last = this.list.pop();
108+
if (this.size() === 0) return last;
109+
const returnItem = this.list[0];
110+
this.list[0] = last;
111+
this.heapify(this.list, this.size(), 0);
112+
return returnItem;
113+
}
114+
115+
size() {
116+
return this.list.length;
117+
}
118+
}
119+
120+
class MaxHeap extends Heap {
121+
constructor(list, comparator) {
122+
if (typeof comparator != 'function') {
123+
comparator = function comparator(inserted, compared) {
124+
return inserted < compared;
125+
};
126+
}
127+
super(list, comparator);
128+
}
129+
130+
heapify(arr, size, i) {
131+
let largest = i;
132+
const left = Math.floor(i * 2 + 1);
133+
const right = Math.floor(i * 2 + 2);
134+
135+
if (left < size && this.comparator(arr[largest], arr[left]))
136+
largest = left;
137+
if (right < size && this.comparator(arr[largest], arr[right]))
138+
largest = right;
139+
140+
if (largest !== i) {
141+
[arr[largest], arr[i]] = [arr[i], arr[largest]];
142+
this.heapify(arr, size, largest);
143+
}
144+
}
145+
}
146+
```
147+
148+
更多题解可以访问:[https://github.com/suukii/91-days-algorithm](https://github.com/suukii/91-days-algorithm)

0 commit comments

Comments
 (0)