Skip to content

Commit fc8c6a5

Browse files
authored
Merge pull request halfrost#213 from gostool/leetcode0807
Leetcode0807
2 parents 577d3d4 + e3bde68 commit fc8c6a5

File tree

3 files changed

+181
-0
lines changed

3 files changed

+181
-0
lines changed
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package leetcode
2+
3+
func maxIncreaseKeepingSkyline(grid [][]int) int {
4+
n := len(grid)
5+
topBottomSkyline := make([]int, 0, n)
6+
leftRightSkyline := make([]int, 0, n)
7+
for i := range grid {
8+
cur := 0
9+
for _, v := range grid[i] {
10+
if cur < v {
11+
cur = v
12+
}
13+
}
14+
leftRightSkyline = append(leftRightSkyline, cur)
15+
}
16+
for j := range grid {
17+
cur := 0
18+
for i := 0; i < len(grid[0]); i++ {
19+
if cur < grid[i][j] {
20+
cur = grid[i][j]
21+
}
22+
}
23+
topBottomSkyline = append(topBottomSkyline, cur)
24+
}
25+
var ans int
26+
for i := range grid {
27+
for j := 0; j < len(grid[0]); j++ {
28+
ans += min(topBottomSkyline[j], leftRightSkyline[i]) - grid[i][j]
29+
}
30+
}
31+
return ans
32+
}
33+
34+
func min(a, b int) int {
35+
if a < b {
36+
return a
37+
}
38+
return b
39+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package leetcode
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
)
7+
8+
type question807 struct {
9+
para807
10+
ans807
11+
}
12+
13+
// para 是参数
14+
type para807 struct {
15+
grid [][]int
16+
}
17+
18+
// ans 是答案
19+
type ans807 struct {
20+
ans int
21+
}
22+
23+
func Test_Problem807(t *testing.T) {
24+
25+
qs := []question807{
26+
27+
{
28+
para807{[][]int{{3, 0, 8, 4}, {2, 4, 5, 7}, {9, 2, 6, 3}, {0, 3, 1, 0}}},
29+
ans807{35},
30+
},
31+
32+
{
33+
para807{[][]int{{0, 0, 0}, {0, 0, 0}, {0, 0, 0}}},
34+
ans807{0},
35+
},
36+
}
37+
38+
fmt.Printf("------------------------Leetcode Problem 807------------------------\n")
39+
40+
for _, q := range qs {
41+
_, p := q.ans807, q.para807
42+
fmt.Printf("【input】:%v 【output】:%v\n", p.grid, maxIncreaseKeepingSkyline(p.grid))
43+
}
44+
fmt.Printf("\n\n\n")
45+
}
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
# [807. Max Increase to Keep City Skyline](https://leetcode-cn.com/problems/max-increase-to-keep-city-skyline/)
2+
3+
## 题目
4+
5+
There is a city composed of n x n blocks, where each block contains a single building shaped like a vertical square prism. You are given a 0-indexed n x n integer matrix grid where grid[r][c] represents the height of the building located in the block at row r and column c.
6+
7+
A city's skyline is the the outer contour formed by all the building when viewing the side of the city from a distance. The skyline from each cardinal direction north, east, south, and west may be different.
8+
9+
We are allowed to increase the height of any number of buildings by any amount (the amount can be different per building). The height of a 0-height building can also be increased. However, increasing the height of a building should not affect the city's skyline from any cardinal direction.
10+
11+
Return the maximum total sum that the height of the buildings can be increased by without changing the city's skyline from any cardinal direction.
12+
13+
**Example 1**:
14+
15+
![https://assets.leetcode.com/uploads/2021/06/21/807-ex1.png](https://assets.leetcode.com/uploads/2021/06/21/807-ex1.png)
16+
17+
Input: grid = [[3,0,8,4],[2,4,5,7],[9,2,6,3],[0,3,1,0]]
18+
Output: 35
19+
Explanation: The building heights are shown in the center of the above image.
20+
The skylines when viewed from each cardinal direction are drawn in red.
21+
The grid after increasing the height of buildings without affecting skylines is:
22+
gridNew = [ [8, 4, 8, 7],
23+
[7, 4, 7, 7],
24+
[9, 4, 8, 7],
25+
[3, 3, 3, 3] ]
26+
27+
**Example 2**:
28+
29+
Input: grid = [[0,0,0],[0,0,0],[0,0,0]]
30+
Output: 0
31+
Explanation: Increasing the height of any building will result in the skyline changing.
32+
33+
**Constraints:**
34+
35+
- n == grid.length
36+
- n == grid[r].length
37+
- 2 <= n <= 50
38+
- 0 <= grid[r][c] <= 100
39+
40+
## 题目大意
41+
42+
在二维数组grid中,grid[i][j]代表位于某处的建筑物的高度。 我们被允许增加任何数量(不同建筑物的数量可能不同)的建筑物的高度。 高度 0 也被认为是建筑物。
43+
44+
最后,从新数组的所有四个方向(即顶部,底部,左侧和右侧)观看的“天际线”必须与原始数组的天际线相同。 城市的天际线是从远处观看时,由所有建筑物形成的矩形的外部轮廓。 请看下面的例子。
45+
46+
建筑物高度可以增加的最大总和是多少?
47+
48+
## 解题思路
49+
50+
- 从数组竖直方向(即顶部,底部)看“天际线”计算出topBottomSkyline
51+
- 从数组水平方向(即左侧,右侧)看“天际线”计算出leftRightSkyline
52+
- 计算grid中每个元素与对应的topBottomSkyline和leftRightSkyline中较小值的差值
53+
- 统计所有差值的总和ans并返回
54+
55+
## 代码
56+
57+
```go
58+
package leetcode
59+
60+
func maxIncreaseKeepingSkyline(grid [][]int) int {
61+
n := len(grid)
62+
topBottomSkyline := make([]int, 0, n)
63+
leftRightSkyline := make([]int, 0, n)
64+
for i := range grid {
65+
cur := 0
66+
for _, v := range grid[i] {
67+
if cur < v {
68+
cur = v
69+
}
70+
}
71+
leftRightSkyline = append(leftRightSkyline, cur)
72+
}
73+
for j := range grid {
74+
cur := 0
75+
for i := 0; i < len(grid[0]); i++ {
76+
if cur < grid[i][j] {
77+
cur = grid[i][j]
78+
}
79+
}
80+
topBottomSkyline = append(topBottomSkyline, cur)
81+
}
82+
var ans int
83+
for i := range grid {
84+
for j := 0; j < len(grid[0]); j++ {
85+
ans += min(topBottomSkyline[j], leftRightSkyline[i]) - grid[i][j]
86+
}
87+
}
88+
return ans
89+
}
90+
91+
func min(a, b int) int {
92+
if a < b {
93+
return a
94+
}
95+
return b
96+
}
97+
```

0 commit comments

Comments
 (0)