Skip to content

Commit e6f23ca

Browse files
committed
添加 problem 1049
1 parent c9f7edf commit e6f23ca

File tree

3 files changed

+123
-0
lines changed

3 files changed

+123
-0
lines changed
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package leetcode
2+
3+
func lastStoneWeightII(stones []int) int {
4+
sum := 0
5+
for _, v := range stones {
6+
sum += v
7+
}
8+
n, C, dp := len(stones), sum/2, make([]int, sum/2+1)
9+
for i := 0; i <= C; i++ {
10+
if stones[0] <= i {
11+
dp[i] = stones[0]
12+
} else {
13+
dp[i] = 0
14+
}
15+
}
16+
for i := 1; i < n; i++ {
17+
for j := C; j >= stones[i]; j-- {
18+
dp[j] = max(dp[j], dp[j-stones[i]]+stones[i])
19+
}
20+
}
21+
return sum - 2*dp[C]
22+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package leetcode
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
)
7+
8+
type question1049 struct {
9+
para1049
10+
ans1049
11+
}
12+
13+
// para 是参数
14+
// one 代表第一个参数
15+
type para1049 struct {
16+
one []int
17+
}
18+
19+
// ans 是答案
20+
// one 代表第一个答案
21+
type ans1049 struct {
22+
one int
23+
}
24+
25+
func Test_Problem1049(t *testing.T) {
26+
27+
qs := []question1049{
28+
29+
question1049{
30+
para1049{[]int{2, 7, 4, 1, 8, 1}},
31+
ans1049{1},
32+
},
33+
34+
question1049{
35+
para1049{[]int{21, 26, 31, 33, 40}},
36+
ans1049{5},
37+
},
38+
39+
question1049{
40+
para1049{[]int{1, 2}},
41+
ans1049{1},
42+
},
43+
}
44+
45+
fmt.Printf("------------------------Leetcode Problem 1049------------------------\n")
46+
47+
for _, q := range qs {
48+
_, p := q.ans1049, q.para1049
49+
fmt.Printf("【input】:%v 【output】:%v\n", p, lastStoneWeightII(p.one))
50+
}
51+
fmt.Printf("\n\n\n")
52+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
# [1049. Last Stone Weight II](https://leetcode.com/problems/last-stone-weight-ii/)
2+
3+
## 题目:
4+
5+
We have a collection of rocks, each rock has a positive integer weight.
6+
7+
Each turn, we choose **any two rocks** and smash them together. Suppose the stones have weights `x` and `y` with `x <= y`. The result of this smash is:
8+
9+
- If `x == y`, both stones are totally destroyed;
10+
- If `x != y`, the stone of weight `x` is totally destroyed, and the stone of weight `y`has new weight `y-x`.
11+
12+
At the end, there is at most 1 stone left. Return the **smallest possible** weight of this stone (the weight is 0 if there are no stones left.)
13+
14+
**Example 1:**
15+
16+
Input: [2,7,4,1,8,1]
17+
Output: 1
18+
Explanation:
19+
We can combine 2 and 4 to get 2 so the array converts to [2,7,1,8,1] then,
20+
we can combine 7 and 8 to get 1 so the array converts to [2,1,1,1] then,
21+
we can combine 2 and 1 to get 1 so the array converts to [1,1,1] then,
22+
we can combine 1 and 1 to get 0 so the array converts to [1] then that's the optimal value.
23+
24+
**Note:**
25+
26+
1. `1 <= stones.length <= 30`
27+
2. `1 <= stones[i] <= 100`
28+
29+
30+
31+
## 题目大意
32+
33+
有一堆石头,每块石头的重量都是正整数。每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:
34+
35+
如果 x == y,那么两块石头都会被完全粉碎;
36+
如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。
37+
最后,最多只会剩下一块石头。返回此石头最小的可能重量。如果没有石头剩下,就返回 0。
38+
39+
提示:
40+
41+
1. 1 <= stones.length <= 30
42+
2. 1 <= stones[i] <= 1000
43+
44+
45+
## 解题思路
46+
47+
48+
- 给出一个数组,数组里面的元素代表的是石头的重量。现在要求两个石头对碰,如果重量相同,两个石头都消失,如果一个重一个轻,剩下的石头是两者的差值。问经过这样的多次碰撞以后,能剩下的石头的重量最轻是多少?
49+
- 由于两两石头要发生碰撞,所以可以将整个数组可以分为两部分,如果这两部分的石头重量总和相差不大,那么经过若干次碰撞以后,剩下的石头重量一定是最小的。现在就需要找到这样两堆总重量差不多的两堆石头。这个问题就可以转化为 01 背包问题。从数组中找到 `sum/2` 重量的石头集合,如果一半能尽量达到 `sum/2`,那么另外一半和 `sum/2` 的差是最小的,最好的情况就是两堆石头的重量都是 `sum/2`,那么两两石头对碰以后最后都能消失。01 背包的经典模板可以参考第 416 题。

0 commit comments

Comments
 (0)