Skip to content

Commit 8001ba6

Browse files
authored
feat: update solutions to lc problems: No.1893,1894 (doocs#3257)
1 parent 5d595de commit 8001ba6

File tree

12 files changed

+99
-96
lines changed

12 files changed

+99
-96
lines changed

solution/1800-1899/1893.Check if All the Integers in a Range Are Covered/README.md

Lines changed: 32 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -65,13 +65,15 @@ tags:
6565

6666
### 方法一:差分数组
6767

68-
我们可以使用差分数组的思想,对于每个区间 $[l, r]$,我们将 $diff[l]$ 加 $1$,将 $diff[r + 1]$ 减 $1$。
68+
我们可以使用差分数组的思想,创建一个长度为 $52$ 的差分数组 $\textit{diff}$。
6969

70-
最后遍历差分数组,累加每个位置的值,记为 $cur$,如果 $left \le i \le right$ 且 $cur = 0$,则说明 $i$ 没有被任何区间覆盖,返回 `false`
70+
接下来,我们遍历数组 $\textit{ranges}$,对于每个区间 $[l, r]$,我们令 $\textit{diff}[l]$ 自增 $1$,而 $\textit{diff}[r + 1]$ 自减 $1$
7171

72-
否则遍历结束后,返回 `true`
72+
接着,我们遍历差分数组 $\textit{diff}$,维护一个前缀和 $s$,对于每个位置 $i$,我们令 $s$ 自增 $\textit{diff}[i]$,如果 $s \le 0$ 且 $left \le i \le right$,则说明区间 $[left, right]$ 中有一个整数 $i$ 没有被覆盖,返回 $\textit{false}$
7373

74-
时间复杂度 $O(n + M)$,空间复杂度 $O(M)$。其中 $n$ 和 $M$ 分别为区间的数量和区间的范围。
74+
如果遍历完差分数组 $\textit{diff}$ 后都没有返回 $\textit{false}$,则说明区间 $[left, right]$ 中的每个整数都被 $\textit{ranges}$ 中至少一个区间覆盖,返回 $\textit{true}$。
75+
76+
时间复杂度 $O(n + M)$,空间复杂度 $O(M)$。其中 $n$ 是数组 $\textit{ranges}$ 的长度,而 $M$ 是区间的最大值,本题中 $M \le 50$。
7577

7678
<!-- tabs:start -->
7779

@@ -84,10 +86,10 @@ class Solution:
8486
for l, r in ranges:
8587
diff[l] += 1
8688
diff[r + 1] -= 1
87-
cur = 0
89+
s = 0
8890
for i, x in enumerate(diff):
89-
cur += x
90-
if left <= i <= right and cur == 0:
91+
s += x
92+
if s <= 0 and left <= i <= right:
9193
return False
9294
return True
9395
```
@@ -103,10 +105,10 @@ class Solution {
103105
++diff[l];
104106
--diff[r + 1];
105107
}
106-
int cur = 0;
108+
int s = 0;
107109
for (int i = 0; i < diff.length; ++i) {
108-
cur += diff[i];
109-
if (i >= left && i <= right && cur == 0) {
110+
s += diff[i];
111+
if (s <= 0 && left <= i && i <= right) {
110112
return false;
111113
}
112114
}
@@ -121,16 +123,16 @@ class Solution {
121123
class Solution {
122124
public:
123125
bool isCovered(vector<vector<int>>& ranges, int left, int right) {
124-
int diff[52]{};
126+
vector<int> diff(52);
125127
for (auto& range : ranges) {
126128
int l = range[0], r = range[1];
127129
++diff[l];
128130
--diff[r + 1];
129131
}
130-
int cur = 0;
131-
for (int i = 0; i < 52; ++i) {
132-
cur += diff[i];
133-
if (i >= left && i <= right && cur <= 0) {
132+
int s = 0;
133+
for (int i = 0; i < diff.size(); ++i) {
134+
s += diff[i];
135+
if (s <= 0 && left <= i && i <= right) {
134136
return false;
135137
}
136138
}
@@ -144,15 +146,15 @@ public:
144146
```go
145147
func isCovered(ranges [][]int, left int, right int) bool {
146148
diff := [52]int{}
147-
for _, rg := range ranges {
148-
l, r := rg[0], rg[1]
149+
for _, e := range ranges {
150+
l, r := e[0], e[1]
149151
diff[l]++
150152
diff[r+1]--
151153
}
152-
cur := 0
154+
s := 0
153155
for i, x := range diff {
154-
cur += x
155-
if i >= left && i <= right && cur <= 0 {
156+
s += x
157+
if s <= 0 && left <= i && i <= right {
156158
return false
157159
}
158160
}
@@ -164,15 +166,15 @@ func isCovered(ranges [][]int, left int, right int) bool {
164166

165167
```ts
166168
function isCovered(ranges: number[][], left: number, right: number): boolean {
167-
const diff = new Array(52).fill(0);
169+
const diff: number[] = Array(52).fill(0);
168170
for (const [l, r] of ranges) {
169171
++diff[l];
170172
--diff[r + 1];
171173
}
172-
let cur = 0;
173-
for (let i = 0; i < 52; ++i) {
174-
cur += diff[i];
175-
if (i >= left && i <= right && cur <= 0) {
174+
let s = 0;
175+
for (let i = 0; i < diff.length; ++i) {
176+
s += diff[i];
177+
if (s <= 0 && left <= i && i <= right) {
176178
return false;
177179
}
178180
}
@@ -190,15 +192,15 @@ function isCovered(ranges: number[][], left: number, right: number): boolean {
190192
* @return {boolean}
191193
*/
192194
var isCovered = function (ranges, left, right) {
193-
const diff = new Array(52).fill(0);
195+
const diff = Array(52).fill(0);
194196
for (const [l, r] of ranges) {
195197
++diff[l];
196198
--diff[r + 1];
197199
}
198-
let cur = 0;
199-
for (let i = 0; i < 52; ++i) {
200-
cur += diff[i];
201-
if (i >= left && i <= right && cur <= 0) {
200+
let s = 0;
201+
for (let i = 0; i < diff.length; ++i) {
202+
s += diff[i];
203+
if (s <= 0 && left <= i && i <= right) {
202204
return false;
203205
}
204206
}

solution/1800-1899/1893.Check if All the Integers in a Range Are Covered/README_EN.md

Lines changed: 37 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,17 @@ tags:
6161

6262
<!-- solution:start -->
6363

64-
### Solution 1
64+
### Solution 1: Difference Array
65+
66+
We can use the idea of a difference array to create a difference array $\textit{diff}$ of length $52$.
67+
68+
Next, we iterate through the array $\textit{ranges}$. For each interval $[l, r]$, we increment $\textit{diff}[l]$ by $1$ and decrement $\textit{diff}[r + 1]$ by $1$.
69+
70+
Then, we iterate through the difference array $\textit{diff}$, maintaining a prefix sum $s$. For each position $i$, we increment $s$ by $\textit{diff}[i]$. If $s \le 0$ and $left \le i \le right$, it indicates that an integer $i$ within the interval $[left, right]$ is not covered, and we return $\textit{false}$.
71+
72+
If we finish iterating through the difference array $\textit{diff}$ without returning $\textit{false}$, it means that every integer within the interval $[left, right]$ is covered by at least one interval in $\textit{ranges}$, and we return $\textit{true}$.
73+
74+
The time complexity is $O(n + M)$, and the space complexity is $O(M)$. Here, $n$ is the length of the array $\textit{ranges}$, and $M$ is the maximum value of the interval, which in this case is $M \le 50$.
6575

6676
<!-- tabs:start -->
6777

@@ -74,10 +84,10 @@ class Solution:
7484
for l, r in ranges:
7585
diff[l] += 1
7686
diff[r + 1] -= 1
77-
cur = 0
87+
s = 0
7888
for i, x in enumerate(diff):
79-
cur += x
80-
if left <= i <= right and cur == 0:
89+
s += x
90+
if s <= 0 and left <= i <= right:
8191
return False
8292
return True
8393
```
@@ -93,10 +103,10 @@ class Solution {
93103
++diff[l];
94104
--diff[r + 1];
95105
}
96-
int cur = 0;
106+
int s = 0;
97107
for (int i = 0; i < diff.length; ++i) {
98-
cur += diff[i];
99-
if (i >= left && i <= right && cur == 0) {
108+
s += diff[i];
109+
if (s <= 0 && left <= i && i <= right) {
100110
return false;
101111
}
102112
}
@@ -111,16 +121,16 @@ class Solution {
111121
class Solution {
112122
public:
113123
bool isCovered(vector<vector<int>>& ranges, int left, int right) {
114-
int diff[52]{};
124+
vector<int> diff(52);
115125
for (auto& range : ranges) {
116126
int l = range[0], r = range[1];
117127
++diff[l];
118128
--diff[r + 1];
119129
}
120-
int cur = 0;
121-
for (int i = 0; i < 52; ++i) {
122-
cur += diff[i];
123-
if (i >= left && i <= right && cur <= 0) {
130+
int s = 0;
131+
for (int i = 0; i < diff.size(); ++i) {
132+
s += diff[i];
133+
if (s <= 0 && left <= i && i <= right) {
124134
return false;
125135
}
126136
}
@@ -134,15 +144,15 @@ public:
134144
```go
135145
func isCovered(ranges [][]int, left int, right int) bool {
136146
diff := [52]int{}
137-
for _, rg := range ranges {
138-
l, r := rg[0], rg[1]
147+
for _, e := range ranges {
148+
l, r := e[0], e[1]
139149
diff[l]++
140150
diff[r+1]--
141151
}
142-
cur := 0
152+
s := 0
143153
for i, x := range diff {
144-
cur += x
145-
if i >= left && i <= right && cur <= 0 {
154+
s += x
155+
if s <= 0 && left <= i && i <= right {
146156
return false
147157
}
148158
}
@@ -154,15 +164,15 @@ func isCovered(ranges [][]int, left int, right int) bool {
154164

155165
```ts
156166
function isCovered(ranges: number[][], left: number, right: number): boolean {
157-
const diff = new Array(52).fill(0);
167+
const diff: number[] = Array(52).fill(0);
158168
for (const [l, r] of ranges) {
159169
++diff[l];
160170
--diff[r + 1];
161171
}
162-
let cur = 0;
163-
for (let i = 0; i < 52; ++i) {
164-
cur += diff[i];
165-
if (i >= left && i <= right && cur <= 0) {
172+
let s = 0;
173+
for (let i = 0; i < diff.length; ++i) {
174+
s += diff[i];
175+
if (s <= 0 && left <= i && i <= right) {
166176
return false;
167177
}
168178
}
@@ -180,15 +190,15 @@ function isCovered(ranges: number[][], left: number, right: number): boolean {
180190
* @return {boolean}
181191
*/
182192
var isCovered = function (ranges, left, right) {
183-
const diff = new Array(52).fill(0);
193+
const diff = Array(52).fill(0);
184194
for (const [l, r] of ranges) {
185195
++diff[l];
186196
--diff[r + 1];
187197
}
188-
let cur = 0;
189-
for (let i = 0; i < 52; ++i) {
190-
cur += diff[i];
191-
if (i >= left && i <= right && cur <= 0) {
198+
let s = 0;
199+
for (let i = 0; i < diff.length; ++i) {
200+
s += diff[i];
201+
if (s <= 0 && left <= i && i <= right) {
192202
return false;
193203
}
194204
}

solution/1800-1899/1893.Check if All the Integers in a Range Are Covered/Solution.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
class Solution {
22
public:
33
bool isCovered(vector<vector<int>>& ranges, int left, int right) {
4-
int diff[52]{};
4+
vector<int> diff(52);
55
for (auto& range : ranges) {
66
int l = range[0], r = range[1];
77
++diff[l];
88
--diff[r + 1];
99
}
10-
int cur = 0;
11-
for (int i = 0; i < 52; ++i) {
12-
cur += diff[i];
13-
if (i >= left && i <= right && cur <= 0) {
10+
int s = 0;
11+
for (int i = 0; i < diff.size(); ++i) {
12+
s += diff[i];
13+
if (s <= 0 && left <= i && i <= right) {
1414
return false;
1515
}
1616
}

solution/1800-1899/1893.Check if All the Integers in a Range Are Covered/Solution.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
func isCovered(ranges [][]int, left int, right int) bool {
22
diff := [52]int{}
3-
for _, rg := range ranges {
4-
l, r := rg[0], rg[1]
3+
for _, e := range ranges {
4+
l, r := e[0], e[1]
55
diff[l]++
66
diff[r+1]--
77
}
8-
cur := 0
8+
s := 0
99
for i, x := range diff {
10-
cur += x
11-
if i >= left && i <= right && cur <= 0 {
10+
s += x
11+
if s <= 0 && left <= i && i <= right {
1212
return false
1313
}
1414
}

solution/1800-1899/1893.Check if All the Integers in a Range Are Covered/Solution.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@ public boolean isCovered(int[][] ranges, int left, int right) {
66
++diff[l];
77
--diff[r + 1];
88
}
9-
int cur = 0;
9+
int s = 0;
1010
for (int i = 0; i < diff.length; ++i) {
11-
cur += diff[i];
12-
if (i >= left && i <= right && cur == 0) {
11+
s += diff[i];
12+
if (s <= 0 && left <= i && i <= right) {
1313
return false;
1414
}
1515
}

solution/1800-1899/1893.Check if All the Integers in a Range Are Covered/Solution.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@
55
* @return {boolean}
66
*/
77
var isCovered = function (ranges, left, right) {
8-
const diff = new Array(52).fill(0);
8+
const diff = Array(52).fill(0);
99
for (const [l, r] of ranges) {
1010
++diff[l];
1111
--diff[r + 1];
1212
}
13-
let cur = 0;
14-
for (let i = 0; i < 52; ++i) {
15-
cur += diff[i];
16-
if (i >= left && i <= right && cur <= 0) {
13+
let s = 0;
14+
for (let i = 0; i < diff.length; ++i) {
15+
s += diff[i];
16+
if (s <= 0 && left <= i && i <= right) {
1717
return false;
1818
}
1919
}

solution/1800-1899/1893.Check if All the Integers in a Range Are Covered/Solution.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ def isCovered(self, ranges: List[List[int]], left: int, right: int) -> bool:
44
for l, r in ranges:
55
diff[l] += 1
66
diff[r + 1] -= 1
7-
cur = 0
7+
s = 0
88
for i, x in enumerate(diff):
9-
cur += x
10-
if left <= i <= right and cur == 0:
9+
s += x
10+
if s <= 0 and left <= i <= right:
1111
return False
1212
return True

solution/1800-1899/1893.Check if All the Integers in a Range Are Covered/Solution.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
function isCovered(ranges: number[][], left: number, right: number): boolean {
2-
const diff = new Array(52).fill(0);
2+
const diff: number[] = Array(52).fill(0);
33
for (const [l, r] of ranges) {
44
++diff[l];
55
--diff[r + 1];
66
}
7-
let cur = 0;
8-
for (let i = 0; i < 52; ++i) {
9-
cur += diff[i];
10-
if (i >= left && i <= right && cur <= 0) {
7+
let s = 0;
8+
for (let i = 0; i < diff.length; ++i) {
9+
s += diff[i];
10+
if (s <= 0 && left <= i && i <= right) {
1111
return false;
1212
}
1313
}

solution/1800-1899/1894.Find the Student that Will Replace the Chalk/README.md

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -161,10 +161,7 @@ func chalkReplacer(chalk []int, k int) int {
161161

162162
```ts
163163
function chalkReplacer(chalk: number[], k: number): number {
164-
let s = 0;
165-
for (const x of chalk) {
166-
s += x;
167-
}
164+
const s = chalk.reduce((acc, cur) => acc + cur, 0);
168165
k %= s;
169166
for (let i = 0; ; ++i) {
170167
if (k < chalk[i]) {

solution/1800-1899/1894.Find the Student that Will Replace the Chalk/README_EN.md

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -159,10 +159,7 @@ func chalkReplacer(chalk []int, k int) int {
159159

160160
```ts
161161
function chalkReplacer(chalk: number[], k: number): number {
162-
let s = 0;
163-
for (const x of chalk) {
164-
s += x;
165-
}
162+
const s = chalk.reduce((acc, cur) => acc + cur, 0);
166163
k %= s;
167164
for (let i = 0; ; ++i) {
168165
if (k < chalk[i]) {

0 commit comments

Comments
 (0)