Skip to content

feat: update solutions to lc problems: No.1893,1894 #3257

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Jul 11, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -65,13 +65,15 @@ tags:

### 方法一:差分数组

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

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

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

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

时间复杂度 $O(n + M)$,空间复杂度 $O(M)$。其中 $n$ 是数组 $\textit{ranges}$ 的长度,而 $M$ 是区间的最大值,本题中 $M \le 50$。

<!-- tabs:start -->

Expand All @@ -84,10 +86,10 @@ class Solution:
for l, r in ranges:
diff[l] += 1
diff[r + 1] -= 1
cur = 0
s = 0
for i, x in enumerate(diff):
cur += x
if left <= i <= right and cur == 0:
s += x
if s <= 0 and left <= i <= right:
return False
return True
```
Expand All @@ -103,10 +105,10 @@ class Solution {
++diff[l];
--diff[r + 1];
}
int cur = 0;
int s = 0;
for (int i = 0; i < diff.length; ++i) {
cur += diff[i];
if (i >= left && i <= right && cur == 0) {
s += diff[i];
if (s <= 0 && left <= i && i <= right) {
return false;
}
}
Expand All @@ -121,16 +123,16 @@ class Solution {
class Solution {
public:
bool isCovered(vector<vector<int>>& ranges, int left, int right) {
int diff[52]{};
vector<int> diff(52);
for (auto& range : ranges) {
int l = range[0], r = range[1];
++diff[l];
--diff[r + 1];
}
int cur = 0;
for (int i = 0; i < 52; ++i) {
cur += diff[i];
if (i >= left && i <= right && cur <= 0) {
int s = 0;
for (int i = 0; i < diff.size(); ++i) {
s += diff[i];
if (s <= 0 && left <= i && i <= right) {
return false;
}
}
Expand All @@ -144,15 +146,15 @@ public:
```go
func isCovered(ranges [][]int, left int, right int) bool {
diff := [52]int{}
for _, rg := range ranges {
l, r := rg[0], rg[1]
for _, e := range ranges {
l, r := e[0], e[1]
diff[l]++
diff[r+1]--
}
cur := 0
s := 0
for i, x := range diff {
cur += x
if i >= left && i <= right && cur <= 0 {
s += x
if s <= 0 && left <= i && i <= right {
return false
}
}
Expand All @@ -164,15 +166,15 @@ func isCovered(ranges [][]int, left int, right int) bool {

```ts
function isCovered(ranges: number[][], left: number, right: number): boolean {
const diff = new Array(52).fill(0);
const diff: number[] = Array(52).fill(0);
for (const [l, r] of ranges) {
++diff[l];
--diff[r + 1];
}
let cur = 0;
for (let i = 0; i < 52; ++i) {
cur += diff[i];
if (i >= left && i <= right && cur <= 0) {
let s = 0;
for (let i = 0; i < diff.length; ++i) {
s += diff[i];
if (s <= 0 && left <= i && i <= right) {
return false;
}
}
Expand All @@ -190,15 +192,15 @@ function isCovered(ranges: number[][], left: number, right: number): boolean {
* @return {boolean}
*/
var isCovered = function (ranges, left, right) {
const diff = new Array(52).fill(0);
const diff = Array(52).fill(0);
for (const [l, r] of ranges) {
++diff[l];
--diff[r + 1];
}
let cur = 0;
for (let i = 0; i < 52; ++i) {
cur += diff[i];
if (i >= left && i <= right && cur <= 0) {
let s = 0;
for (let i = 0; i < diff.length; ++i) {
s += diff[i];
if (s <= 0 && left <= i && i <= right) {
return false;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,17 @@ tags:

<!-- solution:start -->

### Solution 1
### Solution 1: Difference Array

We can use the idea of a difference array to create a difference array $\textit{diff}$ of length $52$.

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$.

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}$.

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}$.

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$.

<!-- tabs:start -->

Expand All @@ -74,10 +84,10 @@ class Solution:
for l, r in ranges:
diff[l] += 1
diff[r + 1] -= 1
cur = 0
s = 0
for i, x in enumerate(diff):
cur += x
if left <= i <= right and cur == 0:
s += x
if s <= 0 and left <= i <= right:
return False
return True
```
Expand All @@ -93,10 +103,10 @@ class Solution {
++diff[l];
--diff[r + 1];
}
int cur = 0;
int s = 0;
for (int i = 0; i < diff.length; ++i) {
cur += diff[i];
if (i >= left && i <= right && cur == 0) {
s += diff[i];
if (s <= 0 && left <= i && i <= right) {
return false;
}
}
Expand All @@ -111,16 +121,16 @@ class Solution {
class Solution {
public:
bool isCovered(vector<vector<int>>& ranges, int left, int right) {
int diff[52]{};
vector<int> diff(52);
for (auto& range : ranges) {
int l = range[0], r = range[1];
++diff[l];
--diff[r + 1];
}
int cur = 0;
for (int i = 0; i < 52; ++i) {
cur += diff[i];
if (i >= left && i <= right && cur <= 0) {
int s = 0;
for (int i = 0; i < diff.size(); ++i) {
s += diff[i];
if (s <= 0 && left <= i && i <= right) {
return false;
}
}
Expand All @@ -134,15 +144,15 @@ public:
```go
func isCovered(ranges [][]int, left int, right int) bool {
diff := [52]int{}
for _, rg := range ranges {
l, r := rg[0], rg[1]
for _, e := range ranges {
l, r := e[0], e[1]
diff[l]++
diff[r+1]--
}
cur := 0
s := 0
for i, x := range diff {
cur += x
if i >= left && i <= right && cur <= 0 {
s += x
if s <= 0 && left <= i && i <= right {
return false
}
}
Expand All @@ -154,15 +164,15 @@ func isCovered(ranges [][]int, left int, right int) bool {

```ts
function isCovered(ranges: number[][], left: number, right: number): boolean {
const diff = new Array(52).fill(0);
const diff: number[] = Array(52).fill(0);
for (const [l, r] of ranges) {
++diff[l];
--diff[r + 1];
}
let cur = 0;
for (let i = 0; i < 52; ++i) {
cur += diff[i];
if (i >= left && i <= right && cur <= 0) {
let s = 0;
for (let i = 0; i < diff.length; ++i) {
s += diff[i];
if (s <= 0 && left <= i && i <= right) {
return false;
}
}
Expand All @@ -180,15 +190,15 @@ function isCovered(ranges: number[][], left: number, right: number): boolean {
* @return {boolean}
*/
var isCovered = function (ranges, left, right) {
const diff = new Array(52).fill(0);
const diff = Array(52).fill(0);
for (const [l, r] of ranges) {
++diff[l];
--diff[r + 1];
}
let cur = 0;
for (let i = 0; i < 52; ++i) {
cur += diff[i];
if (i >= left && i <= right && cur <= 0) {
let s = 0;
for (let i = 0; i < diff.length; ++i) {
s += diff[i];
if (s <= 0 && left <= i && i <= right) {
return false;
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
class Solution {
public:
bool isCovered(vector<vector<int>>& ranges, int left, int right) {
int diff[52]{};
vector<int> diff(52);
for (auto& range : ranges) {
int l = range[0], r = range[1];
++diff[l];
--diff[r + 1];
}
int cur = 0;
for (int i = 0; i < 52; ++i) {
cur += diff[i];
if (i >= left && i <= right && cur <= 0) {
int s = 0;
for (int i = 0; i < diff.size(); ++i) {
s += diff[i];
if (s <= 0 && left <= i && i <= right) {
return false;
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
func isCovered(ranges [][]int, left int, right int) bool {
diff := [52]int{}
for _, rg := range ranges {
l, r := rg[0], rg[1]
for _, e := range ranges {
l, r := e[0], e[1]
diff[l]++
diff[r+1]--
}
cur := 0
s := 0
for i, x := range diff {
cur += x
if i >= left && i <= right && cur <= 0 {
s += x
if s <= 0 && left <= i && i <= right {
return false
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@ public boolean isCovered(int[][] ranges, int left, int right) {
++diff[l];
--diff[r + 1];
}
int cur = 0;
int s = 0;
for (int i = 0; i < diff.length; ++i) {
cur += diff[i];
if (i >= left && i <= right && cur == 0) {
s += diff[i];
if (s <= 0 && left <= i && i <= right) {
return false;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,15 @@
* @return {boolean}
*/
var isCovered = function (ranges, left, right) {
const diff = new Array(52).fill(0);
const diff = Array(52).fill(0);
for (const [l, r] of ranges) {
++diff[l];
--diff[r + 1];
}
let cur = 0;
for (let i = 0; i < 52; ++i) {
cur += diff[i];
if (i >= left && i <= right && cur <= 0) {
let s = 0;
for (let i = 0; i < diff.length; ++i) {
s += diff[i];
if (s <= 0 && left <= i && i <= right) {
return false;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ def isCovered(self, ranges: List[List[int]], left: int, right: int) -> bool:
for l, r in ranges:
diff[l] += 1
diff[r + 1] -= 1
cur = 0
s = 0
for i, x in enumerate(diff):
cur += x
if left <= i <= right and cur == 0:
s += x
if s <= 0 and left <= i <= right:
return False
return True
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
function isCovered(ranges: number[][], left: number, right: number): boolean {
const diff = new Array(52).fill(0);
const diff: number[] = Array(52).fill(0);
for (const [l, r] of ranges) {
++diff[l];
--diff[r + 1];
}
let cur = 0;
for (let i = 0; i < 52; ++i) {
cur += diff[i];
if (i >= left && i <= right && cur <= 0) {
let s = 0;
for (let i = 0; i < diff.length; ++i) {
s += diff[i];
if (s <= 0 && left <= i && i <= right) {
return false;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -161,10 +161,7 @@ func chalkReplacer(chalk []int, k int) int {

```ts
function chalkReplacer(chalk: number[], k: number): number {
let s = 0;
for (const x of chalk) {
s += x;
}
const s = chalk.reduce((acc, cur) => acc + cur, 0);
k %= s;
for (let i = 0; ; ++i) {
if (k < chalk[i]) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -159,10 +159,7 @@ func chalkReplacer(chalk []int, k int) int {

```ts
function chalkReplacer(chalk: number[], k: number): number {
let s = 0;
for (const x of chalk) {
s += x;
}
const s = chalk.reduce((acc, cur) => acc + cur, 0);
k %= s;
for (let i = 0; ; ++i) {
if (k < chalk[i]) {
Expand Down
Loading
Loading