Skip to content

Commit b98f6d5

Browse files
committed
add 174 problem solution
1 parent e56a587 commit b98f6d5

File tree

3 files changed

+193
-14
lines changed

3 files changed

+193
-14
lines changed

src/0174.Dungeon-Game/README.md

Lines changed: 73 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,86 @@ Output: "100"
1313
```
1414

1515
## 题意
16-
> ...
16+
> 给定一个整数数组,计算给定区间中所有数的和。
17+
18+
> 注意:
19+
- 你可以假设询问过程中数组不会被修改;
20+
- sumRange()会被调用多次;
1721

1822
## 题解
1923

2024
### 思路1
21-
> ...
22-
Dungeon Game
25+
> 暴力循环求解
26+
>时间复杂度 O(N^2) 空间复杂度 O(1)
27+
```go
28+
package main
29+
30+
type NumArray struct {
31+
Sum []int
32+
}
33+
func Constructor(nums []int) NumArray {
34+
var s NumArray
35+
s.Sum = nums
36+
return s
37+
}
38+
39+
func (this *NumArray) SumRange(i int, j int) int {
40+
ans := 0
41+
for k := i; k <= j; k++ {
42+
ans += this.Sum[k]
43+
}
44+
return ans
45+
}
46+
```
47+
### 思路2
48+
> 将结果全部缓存
49+
> 时间复杂度 O(N^2) 空间复杂度 O(N^2)
2350
```go
51+
package main
52+
53+
type NumArray struct {
54+
m map[[2]int]int
55+
}
56+
func Constructor(nums []int) NumArray {
57+
s := NumArray{m: map[[2]int]int{}}
58+
59+
for i := 0; i < len(nums); i++ {
60+
sum := 0
61+
for j := i; j < len(nums); j++ {
62+
sum += nums[j]
63+
s.m[[2]int{i, j}] = sum
64+
}
65+
}
66+
return s
67+
}
68+
69+
func (this *NumArray) SumRange(i int, j int) int {
70+
return this.m[[2]int{i, j}]
71+
}
2472
```
2573

74+
### 思路3
75+
> 动态规划
76+
> 时间复杂度 O(N^2) 空间复杂度 O(N)
77+
```go
78+
package main
79+
80+
type NumArray struct {
81+
Sum []int
82+
}
83+
func Constructor(nums []int) NumArray {
84+
var res NumArray
85+
res.Sum = make([]int, len(nums)+1)
86+
for k, v := range nums {
87+
res.Sum[k+1] = res.Sum[k] + v
88+
}
89+
return res
90+
}
91+
92+
func (this *NumArray) SumRange(i int, j int) int {
93+
return this.Sum[j+1] - this.Sum[i]
94+
}
95+
```
2696

2797
## 结语
2898

src/0174.Dungeon-Game/Solution.go

Lines changed: 58 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,61 @@
11
package Solution
22

3-
func Solution(x bool) bool {
4-
return x
3+
type NumArray struct {
4+
Sum []int
5+
m map[[2]int]int
56
}
7+
8+
// 暴力循环
9+
func Constructor(nums []int) NumArray {
10+
var s NumArray
11+
s.Sum = nums
12+
return s
13+
}
14+
15+
func (this *NumArray) SumRange(i int, j int) int {
16+
ans := 0
17+
for k := i; k <= j; k++ {
18+
ans += this.Sum[k]
19+
}
20+
return ans
21+
}
22+
23+
// 利用 map 做缓存
24+
func Constructor2(nums []int) NumArray {
25+
s := NumArray{m: map[[2]int]int{}}
26+
27+
for i := 0; i < len(nums); i++ {
28+
sum := 0
29+
for j := i; j < len(nums); j++ {
30+
sum += nums[j]
31+
s.m[[2]int{i, j}] = sum
32+
}
33+
}
34+
return s
35+
}
36+
37+
func (this *NumArray) SumRange2(i int, j int) int {
38+
return this.m[[2]int{i, j}]
39+
}
40+
41+
// DP
42+
// sum[i] = nums[0] + nums[1] + nums[2]
43+
// sum[i+1] = sum[i] + nums[i+1]
44+
func Constructor3(nums []int) NumArray {
45+
var res NumArray
46+
res.Sum = make([]int, len(nums)+1)
47+
for k, v := range nums {
48+
res.Sum[k+1] = res.Sum[k] + v
49+
}
50+
return res
51+
}
52+
53+
func (this *NumArray) SumRange3(i int, j int) int {
54+
return this.Sum[j+1] - this.Sum[i]
55+
}
56+
57+
/**
58+
* Your NumArray object will be instantiated and called as such:
59+
* obj := Constructor(nums);
60+
* param_1 := obj.SumRange(i,j);
61+
*/

src/0174.Dungeon-Game/Solution_test.go

Lines changed: 62 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,21 +10,74 @@ func TestSolution(t *testing.T) {
1010
// 测试用例
1111
cases := []struct {
1212
name string
13-
inputs bool
14-
expect bool
13+
input1 []int
14+
input2 [][]int
15+
expect []int
1516
}{
16-
{"TestCase", true, true},
17-
{"TestCase", true, true},
18-
{"TestCase", false, false},
17+
{"TestCase", []int{-2, 0, 3, -5, 2, -1}, [][]int{{0, 2}, {2, 5}, {0, 5}}, []int{1, -1, -3}},
1918
}
2019

2120
// 开始测试
2221
for i, c := range cases {
2322
t.Run(c.name+" "+strconv.Itoa(i), func(t *testing.T) {
24-
got := Solution(c.inputs)
25-
if !reflect.DeepEqual(got, c.expect) {
26-
t.Fatalf("expected: %v, but got: %v, with inputs: %v",
27-
c.expect, got, c.inputs)
23+
obj := Constructor(c.input1)
24+
for i := 0; i < len(c.input2); i++ {
25+
got := obj.SumRange(c.input2[i][0], c.input2[i][1])
26+
if !reflect.DeepEqual(got, c.expect[i]) {
27+
t.Fatalf("expected: %v, but got: %v, with input2: %v input1: %v ",
28+
c.expect[i], got, c.input2[i], c.input1[i])
29+
}
30+
}
31+
})
32+
}
33+
}
34+
35+
func TestSolution2(t *testing.T) {
36+
// 测试用例
37+
cases := []struct {
38+
name string
39+
input1 []int
40+
input2 [][]int
41+
expect []int
42+
}{
43+
{"TestCase", []int{-2, 0, 3, -5, 2, -1}, [][]int{{0, 2}, {2, 5}, {0, 5}}, []int{1, -1, -3}},
44+
}
45+
46+
// 开始测试
47+
for i, c := range cases {
48+
t.Run(c.name+" "+strconv.Itoa(i), func(t *testing.T) {
49+
obj := Constructor2(c.input1)
50+
for i := 0; i < len(c.input2); i++ {
51+
got := obj.SumRange2(c.input2[i][0], c.input2[i][1])
52+
if !reflect.DeepEqual(got, c.expect[i]) {
53+
t.Fatalf("expected: %v, but got: %v, with input2: %v input1: %v ",
54+
c.expect[i], got, c.input2[i], c.input1[i])
55+
}
56+
}
57+
})
58+
}
59+
}
60+
func TestSolution3(t *testing.T) {
61+
// 测试用例
62+
cases := []struct {
63+
name string
64+
input1 []int
65+
input2 [][]int
66+
expect []int
67+
}{
68+
{"TestCase", []int{-2, 0, 3, -5, 2, -1}, [][]int{{0, 2}, {2, 5}, {0, 5}}, []int{1, -1, -3}},
69+
}
70+
71+
// 开始测试
72+
for i, c := range cases {
73+
t.Run(c.name+" "+strconv.Itoa(i), func(t *testing.T) {
74+
obj := Constructor3(c.input1)
75+
for i := 0; i < len(c.input2); i++ {
76+
got := obj.SumRange3(c.input2[i][0], c.input2[i][1])
77+
if !reflect.DeepEqual(got, c.expect[i]) {
78+
t.Fatalf("expected: %v, but got: %v, with input2: %v input1: %v ",
79+
c.expect[i], got, c.input2[i], c.input1[i])
80+
}
2881
}
2982
})
3083
}

0 commit comments

Comments
 (0)