Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 305fef5

Browse files
feat: add solutions to lc problems: No.2015,2016 (doocs#3370)
* No.2015.Average Height of Buildings in Each Segment * No.2016.Maximum Difference Between Increasing Elements
1 parent bd8f46b commit 305fef5

File tree

12 files changed

+455
-300
lines changed

12 files changed

+455
-300
lines changed

‎solution/2000-2099/2015.Average Height of Buildings in Each Segment/README.md‎

Lines changed: 131 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -94,11 +94,15 @@ tags:
9494

9595
<!-- solution:start -->
9696

97-
### 方法一:差分有序哈希表
97+
### 方法一:差分思想 + 哈希表
9898

99-
我们利用差分思想,使用有序哈希表 `height` 记录每个位置的高度变化,`cnt` 记录建筑物的数量变化。对有序哈希表求前缀和,即可得到每个位置的高度和建筑物数量
99+
我们可以利用差分思想,用一个哈希表 $\textit{cnt}$ 记录每个位置的建筑物数量变化,用另一个哈希表 $\textit{d}$ 记录每个位置的高度变化
100100

101-
最后遍历有序哈希表,对于每个位置,如果高度和建筑物数量都不为 0,则说明该位置有建筑物,判断此时的建筑物是否与上个建筑物的平均高度相同,如果相同,则合并,否则加入结果集。
101+
接下来,我们对哈希表 $\textit{d}$ 按照键值进行排序,用一个变量 $\textit{s}$ 记录当前位置的高度和,用一个变量 $\textit{m}$ 记录当前位置的建筑物数量。
102+
103+
然后遍历哈希表 $\textit{d},ドル对于每个位置,如果 $\textit{m}$ 不为 0,说明此前有建筑物,我们计算出平均高度,如果当前位置的建筑物与上个建筑物的平均高度相同,则合并,否则加入结果集。
104+
105+
最后返回结果集即可。
102106

103107
时间复杂度 $O(n \times \log n),ドル空间复杂度 $O(n)$。其中 $n$ 为建筑物数量。
104108

@@ -109,25 +113,26 @@ tags:
109113
```python
110114
class Solution:
111115
def averageHeightOfBuildings(self, buildings: List[List[int]]) -> List[List[int]]:
112-
height = defaultdict(int)
113116
cnt = defaultdict(int)
114-
for s, e, h in buildings:
115-
cnt[s] += 1
116-
cnt[e] -= 1
117-
height[s] += h
118-
height[e] -= h
117+
d = defaultdict(int)
118+
for start, end, height in buildings:
119+
cnt[start] += 1
120+
cnt[end] -= 1
121+
d[start] += height
122+
d[end] -= height
123+
s = m = 0
124+
last = -1
119125
ans = []
120-
i = h = n = 0
121-
for j in sorted(cnt.keys()):
122-
if n:
123-
t = [i, j, h // n]
124-
if ans and ans[-1][1] == i and ans[-1][2] == t[-1]:
125-
ans[-1][1] = j
126+
for k, v in sorted(d.items()):
127+
if m:
128+
avg = s // m
129+
if ans and ans[-1][2] == avg and ans[-1][1] == last:
130+
ans[-1][1] = k
126131
else:
127-
ans.append(t)
128-
i = j
129-
h += height[j]
130-
n += cnt[j]
132+
ans.append([last, k, avg])
133+
s += v
134+
m += cnt[k]
135+
last = k
131136
return ans
132137
```
133138

@@ -136,36 +141,34 @@ class Solution:
136141
```java
137142
class Solution {
138143
public int[][] averageHeightOfBuildings(int[][] buildings) {
139-
TreeMap<Integer, Integer> height = new TreeMap<>();
140-
TreeMap<Integer, Integer> cnt = new TreeMap<>();
141-
for (var v : buildings) {
142-
int s = v[0], e = v[1], h = v[2];
143-
cnt.put(s, cnt.getOrDefault(s, 0) +1);
144-
cnt.put(e, cnt.getOrDefault(e, 0) -1);
145-
height.put(s, height.getOrDefault(s, 0) + h);
146-
height.put(e, height.getOrDefault(e, 0) - h);
144+
Map<Integer, Integer> cnt = new HashMap<>();
145+
TreeMap<Integer, Integer> d = new TreeMap<>();
146+
for (var e : buildings) {
147+
int start = e[0], end = e[1], height = e[2];
148+
cnt.merge(start, 1, Integer::sum);
149+
cnt.merge(end, -1, Integer::sum);
150+
d.merge(start, height, Integer::sum);
151+
d.merge(end, -height, Integer::sum);
147152
}
148-
int i = 0, h = 0, n = 0;
149-
List<int[]> res = new ArrayList<>();
150-
for (int j : cnt.keySet()) {
151-
if (n > 0) {
152-
int[] t = new int[] {i, j, h / n};
153-
int k = res.size() - 1;
154-
if (k >= 0 && res.get(k)[1] == i && res.get(k)[2] == t[2]) {
155-
res.get(k)[1] = j;
153+
int s = 0, m = 0;
154+
int last = -1;
155+
List<int[]> ans = new ArrayList<>();
156+
for (var e : d.entrySet()) {
157+
int k = e.getKey(), v = e.getValue();
158+
if (m > 0) {
159+
int avg = s / m;
160+
if (!ans.isEmpty() && ans.get(ans.size() - 1)[2] == avg
161+
&& ans.get(ans.size() - 1)[1] == last) {
162+
ans.get(ans.size() - 1)[1] = k;
156163
} else {
157-
res.add(t);
164+
ans.add(newint[] {last, k, avg});
158165
}
159166
}
160-
h += height.get(j);
161-
n += cnt.get(j);
162-
i = j;
163-
}
164-
int[][] ans = new int[res.size()][3];
165-
for (i = 0; i < ans.length; ++i) {
166-
ans[i] = res.get(i);
167+
s += v;
168+
m += cnt.get(k);
169+
last = k;
167170
}
168-
return ans;
171+
return ans.toArray(newint[0][]);
169172
}
170173
}
171174
```
@@ -176,27 +179,35 @@ class Solution {
176179
class Solution {
177180
public:
178181
vector<vector<int>> averageHeightOfBuildings(vector<vector<int>>& buildings) {
179-
map<int, int> height, cnt;
180-
for (auto& v : buildings) {
181-
int s = v[0], e = v[1], h = v[2];
182-
cnt[s]++, cnt[e]--;
183-
height[s] += h, height[e] -= h;
182+
unordered_map<int, int> cnt;
183+
map<int, int> d;
184+
185+
for (const auto& e : buildings) {
186+
int start = e[0], end = e[1], height = e[2];
187+
cnt[start]++;
188+
cnt[end]--;
189+
d[start] += height;
190+
d[end] -= height;
184191
}
192+
193+
int s = 0, m = 0;
194+
int last = -1;
185195
vector<vector<int>> ans;
186-
int i = 0, h = 0, n = 0;
187-
for (auto& [j, _] : cnt) {
188-
if (n) {
189-
vector<int> t = {i, j, h / n};
190-
if (ans.size() && ans.back()[1] == i && ans.back()[2] == t[2]) {
191-
ans.back()[1] = j;
196+
197+
for (constauto& [k, v] : d) {
198+
if (m > 0) {
199+
int avg = s / m;
200+
if (!ans.empty() && ans.back()[2] == avg && ans.back()[1] == last) {
201+
ans.back()[1] = k;
192202
} else {
193-
ans.push_back(t);
203+
ans.push_back({last, k, avg});
194204
}
195205
}
196-
i = j;
197-
h += height[j];
198-
n += cnt[j];
206+
s += v;
207+
m += cnt[k];
208+
last = k;
199209
}
210+
200211
return ans;
201212
}
202213
};
@@ -206,39 +217,80 @@ public:
206217

207218
```go
208219
func averageHeightOfBuildings(buildings [][]int) [][]int {
209-
height := make(map[int]int)
210220
cnt := make(map[int]int)
211-
for _, v := range buildings {
212-
s, e, h := v[0], v[1], v[2]
213-
cnt[s]++
214-
cnt[e]--
215-
height[s] += h
216-
height[e] -= h
221+
d := make(map[int]int)
222+
223+
for _, e := range buildings {
224+
start, end, height := e[0], e[1], e[2]
225+
cnt[start]++
226+
cnt[end]--
227+
d[start] += height
228+
d[end] -= height
217229
}
218-
keys := make([]int, len(cnt))
219-
for k := range cnt {
230+
231+
s, m := 0, 0
232+
last := -1
233+
var ans [][]int
234+
235+
keys := make([]int, 0, len(d))
236+
for k := range d {
220237
keys = append(keys, k)
221238
}
222239
sort.Ints(keys)
223-
i, h, n := 0, 0, 0
224-
ans := [][]int{}
225-
for _, j := range keys {
226-
if n > 0 {
227-
t := []int{i, j, h / n}
228-
if len(ans) > 0 && ans[len(ans)-1][1] == i && ans[len(ans)-1][2] == t[2] {
229-
ans[len(ans)-1][1] = j
240+
241+
for_, k:= range keys {
242+
v:= d[k]
243+
if m > 0 {
244+
avg := s / m
245+
if len(ans) > 0 && ans[len(ans)-1][2] == avg && ans[len(ans)-1][1] == last {
246+
ans[len(ans)-1][1] = k
230247
} else {
231-
ans = append(ans, t)
248+
ans = append(ans, []int{last, k, avg})
232249
}
233250
}
234-
i = j
235-
h += height[j]
236-
n += cnt[j]
251+
s += v
252+
m += cnt[k]
253+
last = k
237254
}
255+
238256
return ans
239257
}
240258
```
241259

260+
#### TypeScript
261+
262+
```ts
263+
function averageHeightOfBuildings(buildings: number[][]): number[][] {
264+
const cnt = new Map<number, number>();
265+
const d = new Map<number, number>();
266+
for (const [start, end, height] of buildings) {
267+
cnt.set(start, (cnt.get(start) || 0) + 1);
268+
cnt.set(end, (cnt.get(end) || 0) - 1);
269+
d.set(start, (d.get(start) || 0) + height);
270+
d.set(end, (d.get(end) || 0) - height);
271+
}
272+
let [s, m] = [0, 0];
273+
let last = -1;
274+
const ans: number[][] = [];
275+
const sortedKeys = Array.from(d.keys()).sort((a, b) => a - b);
276+
for (const k of sortedKeys) {
277+
const v = d.get(k)!;
278+
if (m > 0) {
279+
const avg = Math.floor(s / m);
280+
if (ans.length > 0 && ans.at(-1)![2] === avg && ans.at(-1)![1] === last) {
281+
ans[ans.length - 1][1] = k;
282+
} else {
283+
ans.push([last, k, avg]);
284+
}
285+
}
286+
s += v;
287+
m += cnt.get(k)!;
288+
last = k;
289+
}
290+
return ans;
291+
}
292+
```
293+
242294
<!-- tabs:end -->
243295

244296
<!-- solution:end -->

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /