Skip to content

Commit 7cf1908

Browse files
committed
feat: add solutions to lc problem: No.1840
No.1840.Maximum Building Height
1 parent ce1beb1 commit 7cf1908

File tree

6 files changed

+332
-2
lines changed

6 files changed

+332
-2
lines changed

solution/1800-1899/1840.Maximum Building Height/README.md

Lines changed: 123 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,22 +66,144 @@
6666

6767
<!-- 这里可写通用的实现逻辑 -->
6868

69+
**方法一:排序 + 数学**
70+
71+
首先,我们将所有的限制条件按照建筑物的编号从小到大排序。
72+
73+
然后我们从左到右遍历所有的限制条件,对于每个限制条件,我们可以得到一个最高高度的上界,即 $r_i[1] = min(r_i[1], r_{i-1}[1] + r_i[0] - r_{i-1}[0])$,其中 $r_i$ 表示第 $i$ 个限制条件,而 $r_i[0]$ 和 $r_i[1]$ 分别表示建筑物的编号以及建筑物的最高高度的上界。
74+
75+
然后我们从右到左遍历所有的限制条件,对于每个限制条件,我们可以得到一个最高高度的上界,即 $r_i[1] = min(r_i[1], r_{i+1}[1] + r_{i+1}[0] - r_i[0])$。
76+
77+
这样,我们就得到了每个限制建筑物的最高高度的上界。
78+
79+
题目求的是最高建筑物的高度,我们可以枚举相邻两个限制条件之间的建筑物 $i$ 和 $i+1$,要使得高度最大,那么高度应该是先增大后减小,假设最大高度为 $t$,那么 $t - r_i[1] + t - r_{i+1}[1] \leq r_{i+1}[0] - r_i[0]$,即 $t \leq \frac{r_i[1] + r_{i+1}[1] + r_{i+1}[0] - r_{i}[0]}{2}$,我们取所有的 $t$ 中的最大值即可。
80+
81+
时间复杂度 $O(n \times \log n)$,空间复杂度 $O(n)$。其中 $n$ 为建筑物的数量。
82+
6983
<!-- tabs:start -->
7084

7185
### **Python3**
7286

7387
<!-- 这里可写当前语言的特殊实现逻辑 -->
7488

7589
```python
76-
90+
class Solution:
91+
def maxBuilding(self, n: int, restrictions: List[List[int]]) -> int:
92+
r = restrictions
93+
r.append([1, 0])
94+
r.sort()
95+
if r[-1][0] != n:
96+
r.append([n, n - 1])
97+
m = len(r)
98+
for i in range(1, m):
99+
r[i][1] = min(r[i][1], r[i - 1][1] + r[i][0] - r[i - 1][0])
100+
for i in range(m - 2, 0, -1):
101+
r[i][1] = min(r[i][1], r[i + 1][1] + r[i + 1][0] - r[i][0])
102+
ans = 0
103+
for i in range(m - 1):
104+
t = (r[i][1] + r[i + 1][1] + r[i + 1][0] - r[i][0]) // 2
105+
ans = max(ans, t)
106+
return ans
77107
```
78108

79109
### **Java**
80110

81111
<!-- 这里可写当前语言的特殊实现逻辑 -->
82112

83113
```java
114+
class Solution {
115+
public int maxBuilding(int n, int[][] restrictions) {
116+
List<int[]> r = new ArrayList<>();
117+
r.addAll(Arrays.asList(restrictions));
118+
r.add(new int[] {1, 0});
119+
Collections.sort(r, (a, b) -> a[0] - b[0]);
120+
if (r.get(r.size() - 1)[0] != n) {
121+
r.add(new int[] {n, n - 1});
122+
}
123+
int m = r.size();
124+
for (int i = 1; i < m; ++i) {
125+
int[] a = r.get(i - 1), b = r.get(i);
126+
b[1] = Math.min(b[1], a[1] + b[0] - a[0]);
127+
}
128+
for (int i = m - 2; i > 0; --i) {
129+
int[] a = r.get(i), b = r.get(i + 1);
130+
a[1] = Math.min(a[1], b[1] + b[0] - a[0]);
131+
}
132+
int ans = 0;
133+
for (int i = 0; i < m - 1; ++i) {
134+
int[] a = r.get(i), b = r.get(i + 1);
135+
int t = (a[1] + b[1] + b[0] - a[0]) / 2;
136+
ans = Math.max(ans, t);
137+
}
138+
return ans;
139+
}
140+
}
141+
```
142+
143+
### **C++**
144+
145+
```cpp
146+
class Solution {
147+
public:
148+
int maxBuilding(int n, vector<vector<int>>& restrictions) {
149+
auto&& r = restrictions;
150+
r.push_back({1, 0});
151+
sort(r.begin(), r.end());
152+
if (r[r.size() - 1][0] != n) r.push_back({n, n - 1});
153+
int m = r.size();
154+
for (int i = 1; i < m; ++i) {
155+
r[i][1] = min(r[i][1], r[i - 1][1] + r[i][0] - r[i - 1][0]);
156+
}
157+
for (int i = m - 2; i > 0; --i) {
158+
r[i][1] = min(r[i][1], r[i + 1][1] + r[i + 1][0] - r[i][0]);
159+
}
160+
int ans = 0;
161+
for (int i = 0; i < m - 1; ++i) {
162+
int t = (r[i][1] + r[i + 1][1] + r[i + 1][0] - r[i][0]) / 2;
163+
ans = max(ans, t);
164+
}
165+
return ans;
166+
}
167+
};
168+
```
84169
170+
### **Go**
171+
172+
```go
173+
func maxBuilding(n int, restrictions [][]int) (ans int) {
174+
r := restrictions
175+
r = append(r, []int{1, 0})
176+
sort.Slice(r, func(i, j int) bool { return r[i][0] < r[j][0] })
177+
if r[len(r)-1][0] != n {
178+
r = append(r, []int{n, n - 1})
179+
}
180+
m := len(r)
181+
for i := 1; i < m; i++ {
182+
r[i][1] = min(r[i][1], r[i-1][1]+r[i][0]-r[i-1][0])
183+
}
184+
for i := m - 2; i > 0; i-- {
185+
r[i][1] = min(r[i][1], r[i+1][1]+r[i+1][0]-r[i][0])
186+
}
187+
for i := 0; i < m-1; i++ {
188+
t := (r[i][1] + r[i+1][1] + r[i+1][0] - r[i][0]) / 2
189+
ans = max(ans, t)
190+
}
191+
return ans
192+
}
193+
194+
func max(a, b int) int {
195+
if a > b {
196+
return a
197+
}
198+
return b
199+
}
200+
201+
func min(a, b int) int {
202+
if a < b {
203+
return a
204+
}
205+
return b
206+
}
85207
```
86208

87209
### **...**

solution/1800-1899/1840.Maximum Building Height/README_EN.md

Lines changed: 109 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,13 +65,121 @@ We can build the buildings with heights [0,1,2,3,3,4,4,5,4,3], and the tallest b
6565
### **Python3**
6666

6767
```python
68-
68+
class Solution:
69+
def maxBuilding(self, n: int, restrictions: List[List[int]]) -> int:
70+
r = restrictions
71+
r.append([1, 0])
72+
r.sort()
73+
if r[-1][0] != n:
74+
r.append([n, n - 1])
75+
m = len(r)
76+
for i in range(1, m):
77+
r[i][1] = min(r[i][1], r[i - 1][1] + r[i][0] - r[i - 1][0])
78+
for i in range(m - 2, 0, -1):
79+
r[i][1] = min(r[i][1], r[i + 1][1] + r[i + 1][0] - r[i][0])
80+
ans = 0
81+
for i in range(m - 1):
82+
t = (r[i][1] + r[i + 1][1] + r[i + 1][0] - r[i][0]) // 2
83+
ans = max(ans, t)
84+
return ans
6985
```
7086

7187
### **Java**
7288

7389
```java
90+
class Solution {
91+
public int maxBuilding(int n, int[][] restrictions) {
92+
List<int[]> r = new ArrayList<>();
93+
r.addAll(Arrays.asList(restrictions));
94+
r.add(new int[] {1, 0});
95+
Collections.sort(r, (a, b) -> a[0] - b[0]);
96+
if (r.get(r.size() - 1)[0] != n) {
97+
r.add(new int[] {n, n - 1});
98+
}
99+
int m = r.size();
100+
for (int i = 1; i < m; ++i) {
101+
int[] a = r.get(i - 1), b = r.get(i);
102+
b[1] = Math.min(b[1], a[1] + b[0] - a[0]);
103+
}
104+
for (int i = m - 2; i > 0; --i) {
105+
int[] a = r.get(i), b = r.get(i + 1);
106+
a[1] = Math.min(a[1], b[1] + b[0] - a[0]);
107+
}
108+
int ans = 0;
109+
for (int i = 0; i < m - 1; ++i) {
110+
int[] a = r.get(i), b = r.get(i + 1);
111+
int t = (a[1] + b[1] + b[0] - a[0]) / 2;
112+
ans = Math.max(ans, t);
113+
}
114+
return ans;
115+
}
116+
}
117+
```
118+
119+
### **C++**
120+
121+
```cpp
122+
class Solution {
123+
public:
124+
int maxBuilding(int n, vector<vector<int>>& restrictions) {
125+
auto&& r = restrictions;
126+
r.push_back({1, 0});
127+
sort(r.begin(), r.end());
128+
if (r[r.size() - 1][0] != n) r.push_back({n, n - 1});
129+
int m = r.size();
130+
for (int i = 1; i < m; ++i) {
131+
r[i][1] = min(r[i][1], r[i - 1][1] + r[i][0] - r[i - 1][0]);
132+
}
133+
for (int i = m - 2; i > 0; --i) {
134+
r[i][1] = min(r[i][1], r[i + 1][1] + r[i + 1][0] - r[i][0]);
135+
}
136+
int ans = 0;
137+
for (int i = 0; i < m - 1; ++i) {
138+
int t = (r[i][1] + r[i + 1][1] + r[i + 1][0] - r[i][0]) / 2;
139+
ans = max(ans, t);
140+
}
141+
return ans;
142+
}
143+
};
144+
```
74145
146+
### **Go**
147+
148+
```go
149+
func maxBuilding(n int, restrictions [][]int) (ans int) {
150+
r := restrictions
151+
r = append(r, []int{1, 0})
152+
sort.Slice(r, func(i, j int) bool { return r[i][0] < r[j][0] })
153+
if r[len(r)-1][0] != n {
154+
r = append(r, []int{n, n - 1})
155+
}
156+
m := len(r)
157+
for i := 1; i < m; i++ {
158+
r[i][1] = min(r[i][1], r[i-1][1]+r[i][0]-r[i-1][0])
159+
}
160+
for i := m - 2; i > 0; i-- {
161+
r[i][1] = min(r[i][1], r[i+1][1]+r[i+1][0]-r[i][0])
162+
}
163+
for i := 0; i < m-1; i++ {
164+
t := (r[i][1] + r[i+1][1] + r[i+1][0] - r[i][0]) / 2
165+
ans = max(ans, t)
166+
}
167+
return ans
168+
}
169+
170+
func max(a, b int) int {
171+
if a > b {
172+
return a
173+
}
174+
return b
175+
}
176+
177+
func min(a, b int) int {
178+
if a < b {
179+
return a
180+
}
181+
return b
182+
}
75183
```
76184

77185
### **...**
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
class Solution {
2+
public:
3+
int maxBuilding(int n, vector<vector<int>>& restrictions) {
4+
auto&& r = restrictions;
5+
r.push_back({1, 0});
6+
sort(r.begin(), r.end());
7+
if (r[r.size() - 1][0] != n) r.push_back({n, n - 1});
8+
int m = r.size();
9+
for (int i = 1; i < m; ++i) {
10+
r[i][1] = min(r[i][1], r[i - 1][1] + r[i][0] - r[i - 1][0]);
11+
}
12+
for (int i = m - 2; i > 0; --i) {
13+
r[i][1] = min(r[i][1], r[i + 1][1] + r[i + 1][0] - r[i][0]);
14+
}
15+
int ans = 0;
16+
for (int i = 0; i < m - 1; ++i) {
17+
int t = (r[i][1] + r[i + 1][1] + r[i + 1][0] - r[i][0]) / 2;
18+
ans = max(ans, t);
19+
}
20+
return ans;
21+
}
22+
};
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
func maxBuilding(n int, restrictions [][]int) (ans int) {
2+
r := restrictions
3+
r = append(r, []int{1, 0})
4+
sort.Slice(r, func(i, j int) bool { return r[i][0] < r[j][0] })
5+
if r[len(r)-1][0] != n {
6+
r = append(r, []int{n, n - 1})
7+
}
8+
m := len(r)
9+
for i := 1; i < m; i++ {
10+
r[i][1] = min(r[i][1], r[i-1][1]+r[i][0]-r[i-1][0])
11+
}
12+
for i := m - 2; i > 0; i-- {
13+
r[i][1] = min(r[i][1], r[i+1][1]+r[i+1][0]-r[i][0])
14+
}
15+
for i := 0; i < m-1; i++ {
16+
t := (r[i][1] + r[i+1][1] + r[i+1][0] - r[i][0]) / 2
17+
ans = max(ans, t)
18+
}
19+
return ans
20+
}
21+
22+
func max(a, b int) int {
23+
if a > b {
24+
return a
25+
}
26+
return b
27+
}
28+
29+
func min(a, b int) int {
30+
if a < b {
31+
return a
32+
}
33+
return b
34+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
class Solution {
2+
public int maxBuilding(int n, int[][] restrictions) {
3+
List<int[]> r = new ArrayList<>();
4+
r.addAll(Arrays.asList(restrictions));
5+
r.add(new int[] {1, 0});
6+
Collections.sort(r, (a, b) -> a[0] - b[0]);
7+
if (r.get(r.size() - 1)[0] != n) {
8+
r.add(new int[] {n, n - 1});
9+
}
10+
int m = r.size();
11+
for (int i = 1; i < m; ++i) {
12+
int[] a = r.get(i - 1), b = r.get(i);
13+
b[1] = Math.min(b[1], a[1] + b[0] - a[0]);
14+
}
15+
for (int i = m - 2; i > 0; --i) {
16+
int[] a = r.get(i), b = r.get(i + 1);
17+
a[1] = Math.min(a[1], b[1] + b[0] - a[0]);
18+
}
19+
int ans = 0;
20+
for (int i = 0; i < m - 1; ++i) {
21+
int[] a = r.get(i), b = r.get(i + 1);
22+
int t = (a[1] + b[1] + b[0] - a[0]) / 2;
23+
ans = Math.max(ans, t);
24+
}
25+
return ans;
26+
}
27+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
class Solution:
2+
def maxBuilding(self, n: int, restrictions: List[List[int]]) -> int:
3+
r = restrictions
4+
r.append([1, 0])
5+
r.sort()
6+
if r[-1][0] != n:
7+
r.append([n, n - 1])
8+
m = len(r)
9+
for i in range(1, m):
10+
r[i][1] = min(r[i][1], r[i - 1][1] + r[i][0] - r[i - 1][0])
11+
for i in range(m - 2, 0, -1):
12+
r[i][1] = min(r[i][1], r[i + 1][1] + r[i + 1][0] - r[i][0])
13+
ans = 0
14+
for i in range(m - 1):
15+
t = (r[i][1] + r[i + 1][1] + r[i + 1][0] - r[i][0]) // 2
16+
ans = max(ans, t)
17+
return ans

0 commit comments

Comments
 (0)