Skip to content

Commit 0a1b519

Browse files
authored
feat: add weekly contest 505 (#5244)
1 parent 6f2d37f commit 0a1b519

26 files changed

Lines changed: 1574 additions & 10 deletions

File tree

solution/3900-3999/3951.Minimum Energy to Maintain Brightness/README.md

Lines changed: 118 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -95,32 +95,146 @@ edit_url: https://github.com/doocs/leetcode/edit/main/solution/3900-3999/3951.Mi
9595

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

98-
### 方法一
98+
### 方法一:区间合并
99+
100+
一个灯泡最多可以照亮 3 个位置,要使得总照明度至少为 $\textit{brightness}$,需要开启的灯泡数为 $\lceil \frac{\textit{brightness}}{3} \rceil$,在计算机中通常写成整除形式:`(brightness + 2) / 3`
101+
102+
本题可以通过以下步骤解决:
103+
104+
1. **合并重叠区间**:将所有有交集的区间进行合并,得到若干个互不相交的连续区间。
105+
2. **计算长度贡献**:对于合并后的每个区间 $[start, end]$,其覆盖的整数点个数(即位置数)为 $m = end - start + 1$。由于区间内的每个位置都需要满足最小照明度,因此该区间所需的总能量为:
106+
$$\text{能量} = \lceil \frac{\textit{brightness}}{3} \rceil \times m$$
107+
3. **累加求和**:将所有不相交区间的能量累加即为最终答案 $\textit{ans}$。
108+
109+
时间复杂度 $O(n \times \log n)$,空间复杂度 $O(n)$。其中 $n$ 是区间的数量。
99110

100111
<!-- tabs:start -->
101112

102113
#### Python3
103114

104115
```python
105-
116+
class Solution:
117+
def minEnergy(self, n: int, brightness: int, intervals: list[list[int]]) -> int:
118+
intervals.sort()
119+
merged = [intervals[0]]
120+
for x in intervals[1:]:
121+
if merged[-1][1] < x[0]:
122+
merged.append(x)
123+
else:
124+
merged[-1][1] = max(merged[-1][1], x[1])
125+
ans = 0
126+
for start, end in merged:
127+
m = end - start + 1
128+
ans += (brightness + 2) // 3 * m
129+
return ans
106130
```
107131

108132
#### Java
109133

110134
```java
111-
135+
class Solution {
136+
public long minEnergy(int n, int brightness, int[][] intervals) {
137+
Arrays.sort(intervals, (a, b) -> Integer.compare(a[0], b[0]));
138+
List<int[]> merged = new ArrayList<>();
139+
merged.add(intervals[0]);
140+
for (int i = 1; i < intervals.length; i++) {
141+
int[] x = intervals[i];
142+
int[] last = merged.get(merged.size() - 1);
143+
if (last[1] < x[0]) {
144+
merged.add(x);
145+
} else {
146+
last[1] = Math.max(last[1], x[1]);
147+
}
148+
}
149+
long ans = 0;
150+
for (int[] interval : merged) {
151+
int start = interval[0];
152+
int end = interval[1];
153+
int m = end - start + 1;
154+
ans += (brightness + 2L) / 3 * m;
155+
}
156+
return ans;
157+
}
158+
}
112159
```
113160

114161
#### C++
115162

116163
```cpp
117-
164+
class Solution {
165+
public:
166+
long long minEnergy(int n, int brightness, vector<vector<int>>& intervals) {
167+
sort(intervals.begin(), intervals.end());
168+
vector<vector<int>> merged = {intervals[0]};
169+
for (int i = 1; i < intervals.size(); ++i) {
170+
auto& x = intervals[i];
171+
if (merged.back()[1] < x[0]) {
172+
merged.push_back(x);
173+
} else {
174+
merged.back()[1] = max(merged.back()[1], x[1]);
175+
}
176+
}
177+
long long ans = 0;
178+
for (const auto& interval : merged) {
179+
int start = interval[0];
180+
int end = interval[1];
181+
int m = end - start + 1;
182+
ans += (brightness + 2LL) / 3 * m;
183+
}
184+
return ans;
185+
}
186+
};
118187
```
119188
120189
#### Go
121190
122191
```go
192+
func minEnergy(n int, brightness int, intervals [][]int) int64 {
193+
sort.Slice(intervals, func(i, j int) bool {
194+
return intervals[i][0] < intervals[j][0]
195+
})
196+
merged := [][]int{intervals[0]}
197+
for _, x := range intervals[1:] {
198+
if merged[len(merged)-1][1] < x[0] {
199+
merged = append(merged, x)
200+
} else {
201+
if x[1] > merged[len(merged)-1][1] {
202+
merged[len(merged)-1][1] = x[1]
203+
}
204+
}
205+
}
206+
ans := 0
207+
for _, interval := range merged {
208+
start := interval[0]
209+
end := interval[1]
210+
m := end - start + 1
211+
ans += (brightness + 2) / 3 * m
212+
}
213+
return int64(ans)
214+
}
215+
```
123216

217+
#### TypeScript
218+
219+
```ts
220+
function minEnergy(n: number, brightness: number, intervals: number[][]): number {
221+
intervals.sort((a, b) => a[0] - b[0]);
222+
const merged: number[][] = [intervals[0]];
223+
for (let i = 1; i < intervals.length; i++) {
224+
const x = intervals[i];
225+
if (merged[merged.length - 1][1] < x[0]) {
226+
merged.push(x);
227+
} else {
228+
merged[merged.length - 1][1] = Math.max(merged[merged.length - 1][1], x[1]);
229+
}
230+
}
231+
let ans = 0;
232+
for (const [start, end] of merged) {
233+
const m = end - start + 1;
234+
ans += Math.ceil(brightness / 3) * m;
235+
}
236+
return ans;
237+
}
124238
```
125239

126240
<!-- tabs:end -->

solution/3900-3999/3951.Minimum Energy to Maintain Brightness/README_EN.md

Lines changed: 118 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,32 +93,146 @@ edit_url: https://github.com/doocs/leetcode/edit/main/solution/3900-3999/3951.Mi
9393

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

96-
### Solution 1
96+
### Solution 1: Interval Merge
97+
98+
A single bulb can illuminate at most 3 positions. To ensure the total brightness is at least $\textit{brightness}$, the number of bulbs required to be turned on is $\lceil \frac{\textit{brightness}}{3} \rceil$. In programming, this is commonly written in integer division form as `(brightness + 2) / 3`.
99+
100+
This problem can be solved through the following steps:
101+
102+
1. **Merge Overlapping Intervals**: Merge all intervals that intersect with each other to obtain a set of mutually disjoint continuous intervals.
103+
2. **Calculate Length Contribution**: For each merged interval $[start, end]$, the number of integer points (i.e., positions) it covers is $m = end - start + 1$. Since every position within the interval must satisfy the minimum brightness, the total energy required for this interval is:
104+
$$\text{Energy} = \lceil \frac{\textit{brightness}}{3} \rceil \times m$$
105+
3. **Accumulate and Sum**: Accumulate the energy of all disjoint intervals to get the final answer $\textit{ans}$.
106+
107+
The time complexity is $O(n \log n)$, and the space complexity is $O(n)$, where $n$ is the number of intervals.
97108

98109
<!-- tabs:start -->
99110

100111
#### Python3
101112

102113
```python
103-
114+
class Solution:
115+
def minEnergy(self, n: int, brightness: int, intervals: list[list[int]]) -> int:
116+
intervals.sort()
117+
merged = [intervals[0]]
118+
for x in intervals[1:]:
119+
if merged[-1][1] < x[0]:
120+
merged.append(x)
121+
else:
122+
merged[-1][1] = max(merged[-1][1], x[1])
123+
ans = 0
124+
for start, end in merged:
125+
m = end - start + 1
126+
ans += (brightness + 2) // 3 * m
127+
return ans
104128
```
105129

106130
#### Java
107131

108132
```java
109-
133+
class Solution {
134+
public long minEnergy(int n, int brightness, int[][] intervals) {
135+
Arrays.sort(intervals, (a, b) -> Integer.compare(a[0], b[0]));
136+
List<int[]> merged = new ArrayList<>();
137+
merged.add(intervals[0]);
138+
for (int i = 1; i < intervals.length; i++) {
139+
int[] x = intervals[i];
140+
int[] last = merged.get(merged.size() - 1);
141+
if (last[1] < x[0]) {
142+
merged.add(x);
143+
} else {
144+
last[1] = Math.max(last[1], x[1]);
145+
}
146+
}
147+
long ans = 0;
148+
for (int[] interval : merged) {
149+
int start = interval[0];
150+
int end = interval[1];
151+
int m = end - start + 1;
152+
ans += (brightness + 2L) / 3 * m;
153+
}
154+
return ans;
155+
}
156+
}
110157
```
111158

112159
#### C++
113160

114161
```cpp
115-
162+
class Solution {
163+
public:
164+
long long minEnergy(int n, int brightness, vector<vector<int>>& intervals) {
165+
sort(intervals.begin(), intervals.end());
166+
vector<vector<int>> merged = {intervals[0]};
167+
for (int i = 1; i < intervals.size(); ++i) {
168+
auto& x = intervals[i];
169+
if (merged.back()[1] < x[0]) {
170+
merged.push_back(x);
171+
} else {
172+
merged.back()[1] = max(merged.back()[1], x[1]);
173+
}
174+
}
175+
long long ans = 0;
176+
for (const auto& interval : merged) {
177+
int start = interval[0];
178+
int end = interval[1];
179+
int m = end - start + 1;
180+
ans += (brightness + 2LL) / 3 * m;
181+
}
182+
return ans;
183+
}
184+
};
116185
```
117186
118187
#### Go
119188
120189
```go
190+
func minEnergy(n int, brightness int, intervals [][]int) int64 {
191+
sort.Slice(intervals, func(i, j int) bool {
192+
return intervals[i][0] < intervals[j][0]
193+
})
194+
merged := [][]int{intervals[0]}
195+
for _, x := range intervals[1:] {
196+
if merged[len(merged)-1][1] < x[0] {
197+
merged = append(merged, x)
198+
} else {
199+
if x[1] > merged[len(merged)-1][1] {
200+
merged[len(merged)-1][1] = x[1]
201+
}
202+
}
203+
}
204+
ans := 0
205+
for _, interval := range merged {
206+
start := interval[0]
207+
end := interval[1]
208+
m := end - start + 1
209+
ans += (brightness + 2) / 3 * m
210+
}
211+
return int64(ans)
212+
}
213+
```
121214

215+
#### TypeScript
216+
217+
```ts
218+
function minEnergy(n: number, brightness: number, intervals: number[][]): number {
219+
intervals.sort((a, b) => a[0] - b[0]);
220+
const merged: number[][] = [intervals[0]];
221+
for (let i = 1; i < intervals.length; i++) {
222+
const x = intervals[i];
223+
if (merged[merged.length - 1][1] < x[0]) {
224+
merged.push(x);
225+
} else {
226+
merged[merged.length - 1][1] = Math.max(merged[merged.length - 1][1], x[1]);
227+
}
228+
}
229+
let ans = 0;
230+
for (const [start, end] of merged) {
231+
const m = end - start + 1;
232+
ans += Math.ceil(brightness / 3) * m;
233+
}
234+
return ans;
235+
}
122236
```
123237

124238
<!-- tabs:end -->
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
class Solution {
2+
public:
3+
long long minEnergy(int n, int brightness, vector<vector<int>>& intervals) {
4+
sort(intervals.begin(), intervals.end());
5+
vector<vector<int>> merged = {intervals[0]};
6+
for (int i = 1; i < intervals.size(); ++i) {
7+
auto& x = intervals[i];
8+
if (merged.back()[1] < x[0]) {
9+
merged.push_back(x);
10+
} else {
11+
merged.back()[1] = max(merged.back()[1], x[1]);
12+
}
13+
}
14+
long long ans = 0;
15+
for (const auto& interval : merged) {
16+
int start = interval[0];
17+
int end = interval[1];
18+
int m = end - start + 1;
19+
ans += (brightness + 2LL) / 3 * m;
20+
}
21+
return ans;
22+
}
23+
};
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
func minEnergy(n int, brightness int, intervals [][]int) int64 {
2+
sort.Slice(intervals, func(i, j int) bool {
3+
return intervals[i][0] < intervals[j][0]
4+
})
5+
merged := [][]int{intervals[0]}
6+
for _, x := range intervals[1:] {
7+
if merged[len(merged)-1][1] < x[0] {
8+
merged = append(merged, x)
9+
} else {
10+
if x[1] > merged[len(merged)-1][1] {
11+
merged[len(merged)-1][1] = x[1]
12+
}
13+
}
14+
}
15+
ans := 0
16+
for _, interval := range merged {
17+
start := interval[0]
18+
end := interval[1]
19+
m := end - start + 1
20+
ans += (brightness + 2) / 3 * m
21+
}
22+
return int64(ans)
23+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
class Solution {
2+
public long minEnergy(int n, int brightness, int[][] intervals) {
3+
Arrays.sort(intervals, (a, b) -> Integer.compare(a[0], b[0]));
4+
List<int[]> merged = new ArrayList<>();
5+
merged.add(intervals[0]);
6+
for (int i = 1; i < intervals.length; i++) {
7+
int[] x = intervals[i];
8+
int[] last = merged.get(merged.size() - 1);
9+
if (last[1] < x[0]) {
10+
merged.add(x);
11+
} else {
12+
last[1] = Math.max(last[1], x[1]);
13+
}
14+
}
15+
long ans = 0;
16+
for (int[] interval : merged) {
17+
int start = interval[0];
18+
int end = interval[1];
19+
int m = end - start + 1;
20+
ans += (brightness + 2L) / 3 * m;
21+
}
22+
return ans;
23+
}
24+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
class Solution:
2+
def minEnergy(self, n: int, brightness: int, intervals: list[list[int]]) -> int:
3+
intervals.sort()
4+
merged = [intervals[0]]
5+
for x in intervals[1:]:
6+
if merged[-1][1] < x[0]:
7+
merged.append(x)
8+
else:
9+
merged[-1][1] = max(merged[-1][1], x[1])
10+
ans = 0
11+
for start, end in merged:
12+
m = end - start + 1
13+
ans += (brightness + 2) // 3 * m
14+
return ans

0 commit comments

Comments
 (0)