[](https://github.com/codespaces/new?hide_repo_select=true&ref=main&repo=149001365&machine=basicLinux32gb&location=SoutheastAsia)
diff --git a/README_EN.md b/README_EN.md
index 47ba7fdfb46b0..4161ac3fb40da 100644
--- a/README_EN.md
+++ b/README_EN.md
@@ -20,7 +20,7 @@ This project contains solutions for problems from LeetCode, "Coding Interviews (
## Site
-https://doocs.github.io/leetcode/en
+https://leetcode.doocs.org/en
## Solutions
@@ -183,9 +183,18 @@ I'm looking for long-term contributors/partners to this repo! Send me [PRs](http
1. Create a pull request with your changes!
1. See [CONTRIBUTING](https://github.com/doocs/.github/blob/main/CONTRIBUTING.md) or [GitHub Help](https://help.github.com/en) for more details.
-
-
-
+
+
+```mermaid
+graph TD;
+ A[LeetCode Repo doocs/leetcode.git] -- 1.Fork --> B[Your GitHub Repo yourusername/leetcode.git];
+ B -- 2.Git Clone --> C[Local Machine];
+ C -- 3.Create a New Branch & Make Changes --> D[Modify Code Locally];
+ D -- 4.Commit & Push to Your Repo --> B;
+ B -- 5.Create a Pull Request --> A;
+```
+
+
diff --git a/solution/0200-0299/0262.Trips and Users/README_EN.md b/solution/0200-0299/0262.Trips and Users/README_EN.md
index 9a6ba0f585bbb..bc65cecf1beeb 100644
--- a/solution/0200-0299/0262.Trips and Users/README_EN.md
+++ b/solution/0200-0299/0262.Trips and Users/README_EN.md
@@ -55,7 +55,7 @@ banned is an ENUM (category) type of ('Yes', 'No').
The cancellation rate is computed by dividing the number of canceled (by client or driver) requests with unbanned users by the total number of requests with unbanned users on that day.
-
Write a solution to find the cancellation rate of requests with unbanned users (both client and driver must not be banned) each day between "2013-10-01" and "2013-10-03". Round Cancellation Rate to two decimal points.
+
Write a solution to find the cancellation rate of requests with unbanned users (both client and driver must not be banned) each day between "2013-10-01" and "2013-10-03" with at least one trip. Round Cancellation Rate to two decimal points.
Return the result table in any order.
diff --git a/solution/0200-0299/0278.First Bad Version/README.md b/solution/0200-0299/0278.First Bad Version/README.md
index 19c1f9bc17397..4bf3178b186a3 100644
--- a/solution/0200-0299/0278.First Bad Version/README.md
+++ b/solution/0200-0299/0278.First Bad Version/README.md
@@ -57,7 +57,15 @@ tags:
-### 方法一
+### 方法一:二分查找
+
+我们定义二分查找的左边界 $l = 1$,右边界 $r = n$。
+
+当 $l < r$ 时,我们计算中间位置 $\textit{mid} = \left\lfloor \frac{l + r}{2} \right\rfloor$,然后调用 `isBadVersion(mid)` 接口,如果返回 $\textit{true}$,则说明第一个错误的版本在 $[l, \textit{mid}]$ 之间,我们令 $r = \textit{mid}$;否则第一个错误的版本在 $[\textit{mid} + 1, r]$ 之间,我们令 $l = \textit{mid} + 1$。
+
+最终返回 $l$ 即可。
+
+时间复杂度 $O(\log n)$,空间复杂度 $O(1)$。
@@ -65,25 +73,19 @@ tags:
```python
# The isBadVersion API is already defined for you.
-# @param version, an integer
-# @return an integer
-# def isBadVersion(version):
+# def isBadVersion(version: int) -> bool:
class Solution:
- def firstBadVersion(self, n):
- """
- :type n: int
- :rtype: int
- """
- left, right = 1, n
- while left < right:
- mid = (left + right) >> 1
+ def firstBadVersion(self, n: int) -> int:
+ l, r = 1, n
+ while l < r:
+ mid = (l + r) >> 1
if isBadVersion(mid):
- right = mid
+ r = mid
else:
- left = mid + 1
- return left
+ l = mid + 1
+ return l
```
#### Java
@@ -94,16 +96,16 @@ class Solution:
public class Solution extends VersionControl {
public int firstBadVersion(int n) {
- int left = 1, right = n;
- while (left < right) {
- int mid = (left + right) >>> 1;
+ int l = 1, r = n;
+ while (l < r) {
+ int mid = (l + r) >>> 1;
if (isBadVersion(mid)) {
- right = mid;
+ r = mid;
} else {
- left = mid + 1;
+ l = mid + 1;
}
}
- return left;
+ return l;
}
}
```
@@ -117,16 +119,16 @@ public class Solution extends VersionControl {
class Solution {
public:
int firstBadVersion(int n) {
- int left = 1, right = n;
- while (left < right) {
- int mid = left + ((right - left) >> 1);
+ int l = 1, r = n;
+ while (l < r) {
+ int mid = l + (r - l) / 2;
if (isBadVersion(mid)) {
- right = mid;
+ r = mid;
} else {
- left = mid + 1;
+ l = mid + 1;
}
}
- return left;
+ return l;
}
};
```
@@ -143,19 +145,45 @@ public:
*/
func firstBadVersion(n int) int {
- left, right := 1, n
- for left < right {
- mid := (left + right) >> 1
+ l, r := 1, n
+ for l < r {
+ mid := (l + r) >> 1
if isBadVersion(mid) {
- right = mid
+ r = mid
} else {
- left = mid + 1
+ l = mid + 1
}
}
- return left
+ return l
}
```
+#### TypeScript
+
+```ts
+/**
+ * The knows API is defined in the parent class Relation.
+ * isBadVersion(version: number): boolean {
+ * ...
+ * };
+ */
+
+var solution = function (isBadVersion: any) {
+ return function (n: number): number {
+ let [l, r] = [1, n];
+ while (l < r) {
+ const mid = (l + r) >>> 1;
+ if (isBadVersion(mid)) {
+ r = mid;
+ } else {
+ l = mid + 1;
+ }
+ }
+ return l;
+ };
+};
+```
+
#### Rust
```rust
@@ -165,17 +193,16 @@ func firstBadVersion(n int) int {
impl Solution {
pub fn first_bad_version(&self, n: i32) -> i32 {
- let mut left = 1;
- let mut right = n;
- while left < right {
- let mid = left + (right - left) / 2;
+ let (mut l, mut r) = (1, n);
+ while l < r {
+ let mid = l + (r - l) / 2;
if self.isBadVersion(mid) {
- right = mid;
+ r = mid;
} else {
- left = mid + 1;
+ l = mid + 1;
}
}
- left
+ l
}
}
```
@@ -203,17 +230,16 @@ var solution = function (isBadVersion) {
* @return {integer} The first bad version
*/
return function (n) {
- let left = 1;
- let right = n;
- while (left < right) {
- const mid = (left + right) >>> 1;
+ let [l, r] = [1, n];
+ while (l < r) {
+ const mid = (l + r) >>> 1;
if (isBadVersion(mid)) {
- right = mid;
+ r = mid;
} else {
- left = mid + 1;
+ l = mid + 1;
}
}
- return left;
+ return l;
};
};
```
diff --git a/solution/0200-0299/0278.First Bad Version/README_EN.md b/solution/0200-0299/0278.First Bad Version/README_EN.md
index 5608efe4d2f33..45c6becbac802 100644
--- a/solution/0200-0299/0278.First Bad Version/README_EN.md
+++ b/solution/0200-0299/0278.First Bad Version/README_EN.md
@@ -56,7 +56,15 @@ Then 4 is the first bad version.
-### Solution 1
+### Solution 1: Binary Search
+
+We define the left boundary of the binary search as $l = 1$ and the right boundary as $r = n$.
+
+While $l < r$, we calculate the middle position $\textit{mid} = \left\lfloor \frac{l + r}{2} \right\rfloor$, then call the `isBadVersion(mid)` API. If it returns $\textit{true}$, it means the first bad version is between $[l, \textit{mid}]$, so we set $r = \textit{mid}$; otherwise, the first bad version is between $[\textit{mid} + 1, r]$, so we set $l = \textit{mid} + 1$.
+
+Finally, we return $l$.
+
+The time complexity is $O(\log n)$, and the space complexity is $O(1)$.
@@ -64,25 +72,19 @@ Then 4 is the first bad version.
```python
# The isBadVersion API is already defined for you.
-# @param version, an integer
-# @return an integer
-# def isBadVersion(version):
+# def isBadVersion(version: int) -> bool:
class Solution:
- def firstBadVersion(self, n):
- """
- :type n: int
- :rtype: int
- """
- left, right = 1, n
- while left < right:
- mid = (left + right) >> 1
+ def firstBadVersion(self, n: int) -> int:
+ l, r = 1, n
+ while l < r:
+ mid = (l + r) >> 1
if isBadVersion(mid):
- right = mid
+ r = mid
else:
- left = mid + 1
- return left
+ l = mid + 1
+ return l
```
#### Java
@@ -93,16 +95,16 @@ class Solution:
public class Solution extends VersionControl {
public int firstBadVersion(int n) {
- int left = 1, right = n;
- while (left < right) {
- int mid = (left + right) >>> 1;
+ int l = 1, r = n;
+ while (l < r) {
+ int mid = (l + r) >>> 1;
if (isBadVersion(mid)) {
- right = mid;
+ r = mid;
} else {
- left = mid + 1;
+ l = mid + 1;
}
}
- return left;
+ return l;
}
}
```
@@ -116,16 +118,16 @@ public class Solution extends VersionControl {
class Solution {
public:
int firstBadVersion(int n) {
- int left = 1, right = n;
- while (left < right) {
- int mid = left + ((right - left) >> 1);
+ int l = 1, r = n;
+ while (l < r) {
+ int mid = l + (r - l) / 2;
if (isBadVersion(mid)) {
- right = mid;
+ r = mid;
} else {
- left = mid + 1;
+ l = mid + 1;
}
}
- return left;
+ return l;
}
};
```
@@ -142,19 +144,45 @@ public:
*/
func firstBadVersion(n int) int {
- left, right := 1, n
- for left < right {
- mid := (left + right) >> 1
+ l, r := 1, n
+ for l < r {
+ mid := (l + r) >> 1
if isBadVersion(mid) {
- right = mid
+ r = mid
} else {
- left = mid + 1
+ l = mid + 1
}
}
- return left
+ return l
}
```
+#### TypeScript
+
+```ts
+/**
+ * The knows API is defined in the parent class Relation.
+ * isBadVersion(version: number): boolean {
+ * ...
+ * };
+ */
+
+var solution = function (isBadVersion: any) {
+ return function (n: number): number {
+ let [l, r] = [1, n];
+ while (l < r) {
+ const mid = (l + r) >>> 1;
+ if (isBadVersion(mid)) {
+ r = mid;
+ } else {
+ l = mid + 1;
+ }
+ }
+ return l;
+ };
+};
+```
+
#### Rust
```rust
@@ -164,17 +192,16 @@ func firstBadVersion(n int) int {
impl Solution {
pub fn first_bad_version(&self, n: i32) -> i32 {
- let mut left = 1;
- let mut right = n;
- while left < right {
- let mid = left + (right - left) / 2;
+ let (mut l, mut r) = (1, n);
+ while l < r {
+ let mid = l + (r - l) / 2;
if self.isBadVersion(mid) {
- right = mid;
+ r = mid;
} else {
- left = mid + 1;
+ l = mid + 1;
}
}
- left
+ l
}
}
```
@@ -202,17 +229,16 @@ var solution = function (isBadVersion) {
* @return {integer} The first bad version
*/
return function (n) {
- let left = 1;
- let right = n;
- while (left < right) {
- const mid = (left + right) >>> 1;
+ let [l, r] = [1, n];
+ while (l < r) {
+ const mid = (l + r) >>> 1;
if (isBadVersion(mid)) {
- right = mid;
+ r = mid;
} else {
- left = mid + 1;
+ l = mid + 1;
}
}
- return left;
+ return l;
};
};
```
diff --git a/solution/0200-0299/0278.First Bad Version/Solution.cpp b/solution/0200-0299/0278.First Bad Version/Solution.cpp
index 975f5fdb508dd..5536140dafb6b 100644
--- a/solution/0200-0299/0278.First Bad Version/Solution.cpp
+++ b/solution/0200-0299/0278.First Bad Version/Solution.cpp
@@ -4,15 +4,15 @@
class Solution {
public:
int firstBadVersion(int n) {
- int left = 1, right = n;
- while (left < right) {
- int mid = left + ((right - left) >> 1);
+ int l = 1, r = n;
+ while (l < r) {
+ int mid = l + (r - l) / 2;
if (isBadVersion(mid)) {
- right = mid;
+ r = mid;
} else {
- left = mid + 1;
+ l = mid + 1;
}
}
- return left;
+ return l;
}
-};
\ No newline at end of file
+};
diff --git a/solution/0200-0299/0278.First Bad Version/Solution.go b/solution/0200-0299/0278.First Bad Version/Solution.go
index 6cfe9c4ee4c50..579b225670465 100644
--- a/solution/0200-0299/0278.First Bad Version/Solution.go
+++ b/solution/0200-0299/0278.First Bad Version/Solution.go
@@ -7,14 +7,14 @@
*/
func firstBadVersion(n int) int {
- left, right := 1, n
- for left < right {
- mid := (left + right) >> 1
+ l, r := 1, n
+ for l < r {
+ mid := (l + r) >> 1
if isBadVersion(mid) {
- right = mid
+ r = mid
} else {
- left = mid + 1
+ l = mid + 1
}
}
- return left
-}
\ No newline at end of file
+ return l
+}
diff --git a/solution/0200-0299/0278.First Bad Version/Solution.java b/solution/0200-0299/0278.First Bad Version/Solution.java
index 5039dd4fb8a95..a205ba020c22c 100644
--- a/solution/0200-0299/0278.First Bad Version/Solution.java
+++ b/solution/0200-0299/0278.First Bad Version/Solution.java
@@ -3,15 +3,15 @@
public class Solution extends VersionControl {
public int firstBadVersion(int n) {
- int left = 1, right = n;
- while (left < right) {
- int mid = (left + right) >>> 1;
+ int l = 1, r = n;
+ while (l < r) {
+ int mid = (l + r) >>> 1;
if (isBadVersion(mid)) {
- right = mid;
+ r = mid;
} else {
- left = mid + 1;
+ l = mid + 1;
}
}
- return left;
+ return l;
}
-}
\ No newline at end of file
+}
diff --git a/solution/0200-0299/0278.First Bad Version/Solution.js b/solution/0200-0299/0278.First Bad Version/Solution.js
index 9258a94af6da2..76b3b3dcc548d 100644
--- a/solution/0200-0299/0278.First Bad Version/Solution.js
+++ b/solution/0200-0299/0278.First Bad Version/Solution.js
@@ -18,16 +18,15 @@ var solution = function (isBadVersion) {
* @return {integer} The first bad version
*/
return function (n) {
- let left = 1;
- let right = n;
- while (left < right) {
- const mid = (left + right) >>> 1;
+ let [l, r] = [1, n];
+ while (l < r) {
+ const mid = (l + r) >>> 1;
if (isBadVersion(mid)) {
- right = mid;
+ r = mid;
} else {
- left = mid + 1;
+ l = mid + 1;
}
}
- return left;
+ return l;
};
};
diff --git a/solution/0200-0299/0278.First Bad Version/Solution.py b/solution/0200-0299/0278.First Bad Version/Solution.py
index 8f00dbe67f9cf..74ed74886e2c1 100644
--- a/solution/0200-0299/0278.First Bad Version/Solution.py
+++ b/solution/0200-0299/0278.First Bad Version/Solution.py
@@ -1,20 +1,14 @@
# The isBadVersion API is already defined for you.
-# @param version, an integer
-# @return an integer
-# def isBadVersion(version):
+# def isBadVersion(version: int) -> bool:
class Solution:
- def firstBadVersion(self, n):
- """
- :type n: int
- :rtype: int
- """
- left, right = 1, n
- while left < right:
- mid = (left + right) >> 1
+ def firstBadVersion(self, n: int) -> int:
+ l, r = 1, n
+ while l < r:
+ mid = (l + r) >> 1
if isBadVersion(mid):
- right = mid
+ r = mid
else:
- left = mid + 1
- return left
+ l = mid + 1
+ return l
diff --git a/solution/0200-0299/0278.First Bad Version/Solution.rs b/solution/0200-0299/0278.First Bad Version/Solution.rs
index 42411a4e2a095..97fc16ce989d7 100644
--- a/solution/0200-0299/0278.First Bad Version/Solution.rs
+++ b/solution/0200-0299/0278.First Bad Version/Solution.rs
@@ -4,16 +4,15 @@
impl Solution {
pub fn first_bad_version(&self, n: i32) -> i32 {
- let mut left = 1;
- let mut right = n;
- while left < right {
- let mid = left + (right - left) / 2;
+ let (mut l, mut r) = (1, n);
+ while l < r {
+ let mid = l + (r - l) / 2;
if self.isBadVersion(mid) {
- right = mid;
+ r = mid;
} else {
- left = mid + 1;
+ l = mid + 1;
}
}
- left
+ l
}
}
diff --git a/solution/0200-0299/0278.First Bad Version/Solution.ts b/solution/0200-0299/0278.First Bad Version/Solution.ts
new file mode 100644
index 0000000000000..6a6001924f16d
--- /dev/null
+++ b/solution/0200-0299/0278.First Bad Version/Solution.ts
@@ -0,0 +1,21 @@
+/**
+ * The knows API is defined in the parent class Relation.
+ * isBadVersion(version: number): boolean {
+ * ...
+ * };
+ */
+
+var solution = function (isBadVersion: any) {
+ return function (n: number): number {
+ let [l, r] = [1, n];
+ while (l < r) {
+ const mid = (l + r) >>> 1;
+ if (isBadVersion(mid)) {
+ r = mid;
+ } else {
+ l = mid + 1;
+ }
+ }
+ return l;
+ };
+};
diff --git a/solution/0300-0399/0346.Moving Average from Data Stream/README.md b/solution/0300-0399/0346.Moving Average from Data Stream/README.md
index efb6c61d85aec..2a781655610a2 100644
--- a/solution/0300-0399/0346.Moving Average from Data Stream/README.md
+++ b/solution/0300-0399/0346.Moving Average from Data Stream/README.md
@@ -65,23 +65,30 @@ movingAverage.next(5); // 返回 6.0 = (10 + 3 + 5) / 3
### 方法一:循环数组
+我们定义一个变量 $\textit{s}$,用于计算当前最后 $\textit{size}$ 个元素的和,用一个变量 $\textit{cnt}$ 记录当前元素的总数。另外,我们用一个长度为 $\textit{size}$ 的数组 $\textit{data}$ 记录每个位置的元素对应的值。
+
+调用 $\textit{next}$ 函数时,我们先计算出 $\textit{val}$ 要存放的下标 $i$,然后我们更新元素和 $s$,并且将下标 $i$ 处的值设置为 $\textit{val}$,同时将元素的个数加一。最后,我们返回 $\frac{s}{\min(\textit{cnt}, \textit{size})}$ 的值即可。
+
+时间复杂度 $O(1)$,空间复杂度 $O(n)$,其中 $n$ 是题目给定的整数 $\textit{size}$。
+
#### Python3
```python
class MovingAverage:
+
def __init__(self, size: int):
- self.arr = [0] * size
self.s = 0
+ self.data = [0] * size
self.cnt = 0
def next(self, val: int) -> float:
- idx = self.cnt % len(self.arr)
- self.s += val - self.arr[idx]
- self.arr[idx] = val
+ i = self.cnt % len(self.data)
+ self.s += val - self.data[i]
+ self.data[i] = val
self.cnt += 1
- return self.s / min(self.cnt, len(self.arr))
+ return self.s / min(self.cnt, len(self.data))
# Your MovingAverage object will be instantiated and called as such:
@@ -93,20 +100,20 @@ class MovingAverage:
```java
class MovingAverage {
- private int[] arr;
private int s;
private int cnt;
+ private int[] data;
public MovingAverage(int size) {
- arr = new int[size];
+ data = new int[size];
}
public double next(int val) {
- int idx = cnt % arr.length;
- s += val - arr[idx];
- arr[idx] = val;
+ int i = cnt % data.length;
+ s += val - data[i];
+ data[i] = val;
++cnt;
- return s * 1.0 / Math.min(cnt, arr.length);
+ return s * 1.0 / Math.min(cnt, data.length);
}
}
@@ -123,21 +130,21 @@ class MovingAverage {
class MovingAverage {
public:
MovingAverage(int size) {
- arr.resize(size);
+ data.resize(size);
}
double next(int val) {
- int idx = cnt % arr.size();
- s += val - arr[idx];
- arr[idx] = val;
+ int i = cnt % data.size();
+ s += val - data[i];
+ data[i] = val;
++cnt;
- return (double) s / min(cnt, (int) arr.size());
+ return s * 1.0 / min(cnt, (int) data.size());
}
private:
- vector arr;
- int cnt = 0;
int s = 0;
+ int cnt = 0;
+ vector data;
};
/**
@@ -151,22 +158,23 @@ private:
```go
type MovingAverage struct {
- arr []int
- cnt int
- s int
+ s int
+ cnt int
+ data []int
}
func Constructor(size int) MovingAverage {
- arr := make([]int, size)
- return MovingAverage{arr, 0, 0}
+ return MovingAverage{
+ data: make([]int, size),
+ }
}
func (this *MovingAverage) Next(val int) float64 {
- idx := this.cnt % len(this.arr)
- this.s += val - this.arr[idx]
- this.arr[idx] = val
+ i := this.cnt % len(this.data)
+ this.s += val - this.data[i]
+ this.data[i] = val
this.cnt++
- return float64(this.s) / float64(min(this.cnt, len(this.arr)))
+ return float64(this.s) / float64(min(this.cnt, len(this.data)))
}
/**
@@ -176,6 +184,34 @@ func (this *MovingAverage) Next(val int) float64 {
*/
```
+#### TypeScript
+
+```ts
+class MovingAverage {
+ private s: number = 0;
+ private cnt: number = 0;
+ private data: number[];
+
+ constructor(size: number) {
+ this.data = Array(size).fill(0);
+ }
+
+ next(val: number): number {
+ const i = this.cnt % this.data.length;
+ this.s += val - this.data[i];
+ this.data[i] = val;
+ this.cnt++;
+ return this.s / Math.min(this.cnt, this.data.length);
+ }
+}
+
+/**
+ * Your MovingAverage object will be instantiated and called as such:
+ * var obj = new MovingAverage(size)
+ * var param_1 = obj.next(val)
+ */
+```
+
@@ -184,6 +220,12 @@ func (this *MovingAverage) Next(val int) float64 {
### 方法二:队列
+我们可以使用一个队列 $\textit{q}$ 来存储最后 $\textit{size}$ 个元素,同时用一个变量 $\textit{s}$ 来记录这 $\textit{size}$ 个元素的和。
+
+在调用 $\textit{next}$ 函数时,我们首先判断队列 $\textit{q}$ 的长度是否等于 $\textit{size}$,如果等于 $\textit{size}$,则将队列 $\textit{q}$ 的头部元素出队,并且更新 $\textit{s}$ 的值。然后将 $\textit{val}$ 入队,并且更新 $\textit{s}$ 的值。最后返回 $\frac{s}{\text{len}(q)}$ 的值即可。
+
+时间复杂度 $O(1)$,空间复杂度 $O(n)$,其中 $n$ 是题目给定的整数 $\textit{size}$。
+
#### Python3
@@ -299,6 +341,35 @@ func (this *MovingAverage) Next(val int) float64 {
*/
```
+#### TypeScript
+
+```ts
+class MovingAverage {
+ private q: number[] = [];
+ private s: number = 0;
+ private n: number;
+
+ constructor(size: number) {
+ this.n = size;
+ }
+
+ next(val: number): number {
+ if (this.q.length === this.n) {
+ this.s -= this.q.shift()!;
+ }
+ this.q.push(val);
+ this.s += val;
+ return this.s / this.q.length;
+ }
+}
+
+/**
+ * Your MovingAverage object will be instantiated and called as such:
+ * var obj = new MovingAverage(size)
+ * var param_1 = obj.next(val)
+ */
+```
+
diff --git a/solution/0300-0399/0346.Moving Average from Data Stream/README_EN.md b/solution/0300-0399/0346.Moving Average from Data Stream/README_EN.md
index e6c04298ab273..68d0a084b5d68 100644
--- a/solution/0300-0399/0346.Moving Average from Data Stream/README_EN.md
+++ b/solution/0300-0399/0346.Moving Average from Data Stream/README_EN.md
@@ -61,7 +61,13 @@ movingAverage.next(5); // return 6.0 = (10 + 3 + 5) / 3
-### Solution 1
+### Solution 1: Circular Array
+
+We define a variable $\textit{s}$ to calculate the sum of the last $\textit{size}$ elements, and a variable $\textit{cnt}$ to record the total number of current elements. Additionally, we use an array $\textit{data}$ of length $\textit{size}$ to record the value of each element at each position.
+
+When calling the $\textit{next}$ function, we first calculate the index $i$ where $\textit{val}$ should be stored, then update the sum $s$, set the value at index $i$ to $\textit{val}$, and increment the element count by one. Finally, we return the value of $\frac{s}{\min(\textit{cnt}, \textit{size})}$.
+
+The time complexity is $O(1)$, and the space complexity is $O(n)$, where $n$ is the integer $\textit{size}$ given in the problem.
@@ -69,17 +75,18 @@ movingAverage.next(5); // return 6.0 = (10 + 3 + 5) / 3
```python
class MovingAverage:
+
def __init__(self, size: int):
- self.arr = [0] * size
self.s = 0
+ self.data = [0] * size
self.cnt = 0
def next(self, val: int) -> float:
- idx = self.cnt % len(self.arr)
- self.s += val - self.arr[idx]
- self.arr[idx] = val
+ i = self.cnt % len(self.data)
+ self.s += val - self.data[i]
+ self.data[i] = val
self.cnt += 1
- return self.s / min(self.cnt, len(self.arr))
+ return self.s / min(self.cnt, len(self.data))
# Your MovingAverage object will be instantiated and called as such:
@@ -91,20 +98,20 @@ class MovingAverage:
```java
class MovingAverage {
- private int[] arr;
private int s;
private int cnt;
+ private int[] data;
public MovingAverage(int size) {
- arr = new int[size];
+ data = new int[size];
}
public double next(int val) {
- int idx = cnt % arr.length;
- s += val - arr[idx];
- arr[idx] = val;
+ int i = cnt % data.length;
+ s += val - data[i];
+ data[i] = val;
++cnt;
- return s * 1.0 / Math.min(cnt, arr.length);
+ return s * 1.0 / Math.min(cnt, data.length);
}
}
@@ -121,21 +128,21 @@ class MovingAverage {
class MovingAverage {
public:
MovingAverage(int size) {
- arr.resize(size);
+ data.resize(size);
}
double next(int val) {
- int idx = cnt % arr.size();
- s += val - arr[idx];
- arr[idx] = val;
+ int i = cnt % data.size();
+ s += val - data[i];
+ data[i] = val;
++cnt;
- return (double) s / min(cnt, (int) arr.size());
+ return s * 1.0 / min(cnt, (int) data.size());
}
private:
- vector arr;
- int cnt = 0;
int s = 0;
+ int cnt = 0;
+ vector data;
};
/**
@@ -149,22 +156,23 @@ private:
```go
type MovingAverage struct {
- arr []int
- cnt int
- s int
+ s int
+ cnt int
+ data []int
}
func Constructor(size int) MovingAverage {
- arr := make([]int, size)
- return MovingAverage{arr, 0, 0}
+ return MovingAverage{
+ data: make([]int, size),
+ }
}
func (this *MovingAverage) Next(val int) float64 {
- idx := this.cnt % len(this.arr)
- this.s += val - this.arr[idx]
- this.arr[idx] = val
+ i := this.cnt % len(this.data)
+ this.s += val - this.data[i]
+ this.data[i] = val
this.cnt++
- return float64(this.s) / float64(min(this.cnt, len(this.arr)))
+ return float64(this.s) / float64(min(this.cnt, len(this.data)))
}
/**
@@ -174,13 +182,47 @@ func (this *MovingAverage) Next(val int) float64 {
*/
```
+#### TypeScript
+
+```ts
+class MovingAverage {
+ private s: number = 0;
+ private cnt: number = 0;
+ private data: number[];
+
+ constructor(size: number) {
+ this.data = Array(size).fill(0);
+ }
+
+ next(val: number): number {
+ const i = this.cnt % this.data.length;
+ this.s += val - this.data[i];
+ this.data[i] = val;
+ this.cnt++;
+ return this.s / Math.min(this.cnt, this.data.length);
+ }
+}
+
+/**
+ * Your MovingAverage object will be instantiated and called as such:
+ * var obj = new MovingAverage(size)
+ * var param_1 = obj.next(val)
+ */
+```
+
-### Solution 2
+### Solution 2: Queue
+
+We can use a queue $\textit{q}$ to store the last $\textit{size}$ elements, and a variable $\textit{s}$ to record the sum of these $\textit{size}$ elements.
+
+When calling the $\textit{next}$ function, we first check if the length of the queue $\textit{q}$ is equal to $\textit{size}$. If it is, we dequeue the front element of the queue $\textit{q}$ and update the value of $\textit{s}$. Then we enqueue $\textit{val}$ and update the value of $\textit{s}$. Finally, we return the value of $\frac{s}{\text{len}(q)}$.
+
+The time complexity is $O(1)$, and the space complexity is $O(n)$, where $n$ is the integer $\textit{size}$ given in the problem.
@@ -297,6 +339,35 @@ func (this *MovingAverage) Next(val int) float64 {
*/
```
+#### TypeScript
+
+```ts
+class MovingAverage {
+ private q: number[] = [];
+ private s: number = 0;
+ private n: number;
+
+ constructor(size: number) {
+ this.n = size;
+ }
+
+ next(val: number): number {
+ if (this.q.length === this.n) {
+ this.s -= this.q.shift()!;
+ }
+ this.q.push(val);
+ this.s += val;
+ return this.s / this.q.length;
+ }
+}
+
+/**
+ * Your MovingAverage object will be instantiated and called as such:
+ * var obj = new MovingAverage(size)
+ * var param_1 = obj.next(val)
+ */
+```
+
diff --git a/solution/0300-0399/0346.Moving Average from Data Stream/Solution.cpp b/solution/0300-0399/0346.Moving Average from Data Stream/Solution.cpp
index 2a9a16e4faee5..6576b9dc8630a 100644
--- a/solution/0300-0399/0346.Moving Average from Data Stream/Solution.cpp
+++ b/solution/0300-0399/0346.Moving Average from Data Stream/Solution.cpp
@@ -1,21 +1,21 @@
class MovingAverage {
public:
MovingAverage(int size) {
- arr.resize(size);
+ data.resize(size);
}
double next(int val) {
- int idx = cnt % arr.size();
- s += val - arr[idx];
- arr[idx] = val;
+ int i = cnt % data.size();
+ s += val - data[i];
+ data[i] = val;
++cnt;
- return (double) s / min(cnt, (int) arr.size());
+ return s * 1.0 / min(cnt, (int) data.size());
}
private:
- vector arr;
- int cnt = 0;
int s = 0;
+ int cnt = 0;
+ vector data;
};
/**
diff --git a/solution/0300-0399/0346.Moving Average from Data Stream/Solution.go b/solution/0300-0399/0346.Moving Average from Data Stream/Solution.go
index ec727ba1c0a94..5dcabe9e9361e 100644
--- a/solution/0300-0399/0346.Moving Average from Data Stream/Solution.go
+++ b/solution/0300-0399/0346.Moving Average from Data Stream/Solution.go
@@ -1,20 +1,21 @@
type MovingAverage struct {
- arr []int
- cnt int
- s int
+ s int
+ cnt int
+ data []int
}
func Constructor(size int) MovingAverage {
- arr := make([]int, size)
- return MovingAverage{arr, 0, 0}
+ return MovingAverage{
+ data: make([]int, size),
+ }
}
func (this *MovingAverage) Next(val int) float64 {
- idx := this.cnt % len(this.arr)
- this.s += val - this.arr[idx]
- this.arr[idx] = val
+ i := this.cnt % len(this.data)
+ this.s += val - this.data[i]
+ this.data[i] = val
this.cnt++
- return float64(this.s) / float64(min(this.cnt, len(this.arr)))
+ return float64(this.s) / float64(min(this.cnt, len(this.data)))
}
/**
diff --git a/solution/0300-0399/0346.Moving Average from Data Stream/Solution.java b/solution/0300-0399/0346.Moving Average from Data Stream/Solution.java
index f9e90a100d6e2..d53353922e460 100644
--- a/solution/0300-0399/0346.Moving Average from Data Stream/Solution.java
+++ b/solution/0300-0399/0346.Moving Average from Data Stream/Solution.java
@@ -1,18 +1,18 @@
class MovingAverage {
- private int[] arr;
private int s;
private int cnt;
+ private int[] data;
public MovingAverage(int size) {
- arr = new int[size];
+ data = new int[size];
}
public double next(int val) {
- int idx = cnt % arr.length;
- s += val - arr[idx];
- arr[idx] = val;
+ int i = cnt % data.length;
+ s += val - data[i];
+ data[i] = val;
++cnt;
- return s * 1.0 / Math.min(cnt, arr.length);
+ return s * 1.0 / Math.min(cnt, data.length);
}
}
diff --git a/solution/0300-0399/0346.Moving Average from Data Stream/Solution.py b/solution/0300-0399/0346.Moving Average from Data Stream/Solution.py
index 883ed1d768a19..edc9e4f84623b 100644
--- a/solution/0300-0399/0346.Moving Average from Data Stream/Solution.py
+++ b/solution/0300-0399/0346.Moving Average from Data Stream/Solution.py
@@ -1,15 +1,16 @@
class MovingAverage:
+
def __init__(self, size: int):
- self.arr = [0] * size
self.s = 0
+ self.data = [0] * size
self.cnt = 0
def next(self, val: int) -> float:
- idx = self.cnt % len(self.arr)
- self.s += val - self.arr[idx]
- self.arr[idx] = val
+ i = self.cnt % len(self.data)
+ self.s += val - self.data[i]
+ self.data[i] = val
self.cnt += 1
- return self.s / min(self.cnt, len(self.arr))
+ return self.s / min(self.cnt, len(self.data))
# Your MovingAverage object will be instantiated and called as such:
diff --git a/solution/0300-0399/0346.Moving Average from Data Stream/Solution.ts b/solution/0300-0399/0346.Moving Average from Data Stream/Solution.ts
new file mode 100644
index 0000000000000..db54902553b61
--- /dev/null
+++ b/solution/0300-0399/0346.Moving Average from Data Stream/Solution.ts
@@ -0,0 +1,23 @@
+class MovingAverage {
+ private s: number = 0;
+ private cnt: number = 0;
+ private data: number[];
+
+ constructor(size: number) {
+ this.data = Array(size).fill(0);
+ }
+
+ next(val: number): number {
+ const i = this.cnt % this.data.length;
+ this.s += val - this.data[i];
+ this.data[i] = val;
+ this.cnt++;
+ return this.s / Math.min(this.cnt, this.data.length);
+ }
+}
+
+/**
+ * Your MovingAverage object will be instantiated and called as such:
+ * var obj = new MovingAverage(size)
+ * var param_1 = obj.next(val)
+ */
diff --git a/solution/0300-0399/0346.Moving Average from Data Stream/Solution2.ts b/solution/0300-0399/0346.Moving Average from Data Stream/Solution2.ts
new file mode 100644
index 0000000000000..52a3940d0d2e8
--- /dev/null
+++ b/solution/0300-0399/0346.Moving Average from Data Stream/Solution2.ts
@@ -0,0 +1,24 @@
+class MovingAverage {
+ private q: number[] = [];
+ private s: number = 0;
+ private n: number;
+
+ constructor(size: number) {
+ this.n = size;
+ }
+
+ next(val: number): number {
+ if (this.q.length === this.n) {
+ this.s -= this.q.shift()!;
+ }
+ this.q.push(val);
+ this.s += val;
+ return this.s / this.q.length;
+ }
+}
+
+/**
+ * Your MovingAverage object will be instantiated and called as such:
+ * var obj = new MovingAverage(size)
+ * var param_1 = obj.next(val)
+ */
diff --git a/solution/0300-0399/0369.Plus One Linked List/README.md b/solution/0300-0399/0369.Plus One Linked List/README.md
index 95eebe6928d74..078c4033d9a67 100644
--- a/solution/0300-0399/0369.Plus One Linked List/README.md
+++ b/solution/0300-0399/0369.Plus One Linked List/README.md
@@ -57,13 +57,13 @@ tags:
### 方法一:链表遍历
-我们先设置一个虚拟头节点 `dummy`,初始值为 $0$,指向链表头节点 `head`。
+我们先设置一个虚拟头节点 $\textit{dummy}$,初始时 $\textit{dummy}$ 的值为 $0$,并且 $\textit{dummy}$ 的后继节点为链表 $\textit{head}$。
-然后从链表头节点开始遍历,找出链表最后一个值不等于 $9$ 的节点 `target`,将 `target` 的值加 $1$。接着将 `target` 之后的所有节点值置为 $0$。
+接下来,我们从虚拟头节点开始遍历链表,找到最后一个不为 $9$ 的节点,将其值加 $1$,并将该节点之后的所有节点的值置为 $0$。
-需要注意的是,如果链表中所有节点值都为 $9$,那么遍历结束后,`target` 会指向空节点,这时我们需要将 `dummy` 的值加 $1$,然后返回 `dummy`,否则返回 `dummy` 的下一个节点。
+最后,我们判断虚拟头节点的值是否为 $1$,如果为 $1$,则返回 $\textit{dummy}$,否则返回 $\textit{dummy}$ 的后继节点。
-时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为链表的长度。
+时间复杂度 $O(n)$,其中 $n$ 是链表的长度。空间复杂度 $O(1)$。
@@ -76,7 +76,7 @@ tags:
# self.val = val
# self.next = next
class Solution:
- def plusOne(self, head: ListNode) -> ListNode:
+ def plusOne(self, head: Optional[ListNode]) -> Optional[ListNode]:
dummy = ListNode(0, head)
target = dummy
while head:
@@ -143,17 +143,16 @@ public:
ListNode* plusOne(ListNode* head) {
ListNode* dummy = new ListNode(0, head);
ListNode* target = dummy;
- while (head) {
- if (head->val != 9) target = head;
- head = head->next;
+ for (; head; head = head->next) {
+ if (head->val != 9) {
+ target = head;
+ }
}
- ++target->val;
- target = target->next;
- while (target) {
+ target->val++;
+ for (target = target->next; target; target = target->next) {
target->val = 0;
- target = target->next;
}
- return dummy->val == 1 ? dummy : dummy->next;
+ return dummy->val ? dummy : dummy->next;
}
};
```
@@ -178,10 +177,8 @@ func plusOne(head *ListNode) *ListNode {
head = head.Next
}
target.Val++
- target = target.Next
- for target != nil {
+ for target = target.Next; target != nil; target = target.Next {
target.Val = 0
- target = target.Next
}
if dummy.Val == 1 {
return dummy
@@ -190,6 +187,38 @@ func plusOne(head *ListNode) *ListNode {
}
```
+#### TypeScript
+
+```ts
+/**
+ * Definition for singly-linked list.
+ * class ListNode {
+ * val: number
+ * next: ListNode | null
+ * constructor(val?: number, next?: ListNode | null) {
+ * this.val = (val===undefined ? 0 : val)
+ * this.next = (next===undefined ? null : next)
+ * }
+ * }
+ */
+
+function plusOne(head: ListNode | null): ListNode | null {
+ const dummy = new ListNode(0, head);
+ let target = dummy;
+ while (head) {
+ if (head.val !== 9) {
+ target = head;
+ }
+ head = head.next;
+ }
+ target.val++;
+ for (target = target.next; target; target = target.next) {
+ target.val = 0;
+ }
+ return dummy.val ? dummy : dummy.next;
+}
+```
+
diff --git a/solution/0300-0399/0369.Plus One Linked List/README_EN.md b/solution/0300-0399/0369.Plus One Linked List/README_EN.md
index e56316d0e35b6..f34920e3a5e8a 100644
--- a/solution/0300-0399/0369.Plus One Linked List/README_EN.md
+++ b/solution/0300-0399/0369.Plus One Linked List/README_EN.md
@@ -44,7 +44,15 @@ tags:
-### Solution 1
+### Solution 1: Linked List Traversal
+
+We first set a dummy head node $\textit{dummy}$, initially with a value of $0$, and the successor node of $\textit{dummy}$ is the linked list $\textit{head}$.
+
+Next, we traverse the linked list starting from the dummy head node, find the last node that is not $9$, increment its value by $1$, and set the values of all nodes after this node to $0$.
+
+Finally, we check if the value of the dummy head node is $1$. If it is $1$, we return $\textit{dummy}$; otherwise, we return the successor node of $\textit{dummy}$.
+
+The time complexity is $O(n)$, where $n$ is the length of the linked list. The space complexity is $O(1)$.
@@ -57,7 +65,7 @@ tags:
# self.val = val
# self.next = next
class Solution:
- def plusOne(self, head: ListNode) -> ListNode:
+ def plusOne(self, head: Optional[ListNode]) -> Optional[ListNode]:
dummy = ListNode(0, head)
target = dummy
while head:
@@ -124,17 +132,16 @@ public:
ListNode* plusOne(ListNode* head) {
ListNode* dummy = new ListNode(0, head);
ListNode* target = dummy;
- while (head) {
- if (head->val != 9) target = head;
- head = head->next;
+ for (; head; head = head->next) {
+ if (head->val != 9) {
+ target = head;
+ }
}
- ++target->val;
- target = target->next;
- while (target) {
+ target->val++;
+ for (target = target->next; target; target = target->next) {
target->val = 0;
- target = target->next;
}
- return dummy->val == 1 ? dummy : dummy->next;
+ return dummy->val ? dummy : dummy->next;
}
};
```
@@ -159,10 +166,8 @@ func plusOne(head *ListNode) *ListNode {
head = head.Next
}
target.Val++
- target = target.Next
- for target != nil {
+ for target = target.Next; target != nil; target = target.Next {
target.Val = 0
- target = target.Next
}
if dummy.Val == 1 {
return dummy
@@ -171,6 +176,38 @@ func plusOne(head *ListNode) *ListNode {
}
```
+#### TypeScript
+
+```ts
+/**
+ * Definition for singly-linked list.
+ * class ListNode {
+ * val: number
+ * next: ListNode | null
+ * constructor(val?: number, next?: ListNode | null) {
+ * this.val = (val===undefined ? 0 : val)
+ * this.next = (next===undefined ? null : next)
+ * }
+ * }
+ */
+
+function plusOne(head: ListNode | null): ListNode | null {
+ const dummy = new ListNode(0, head);
+ let target = dummy;
+ while (head) {
+ if (head.val !== 9) {
+ target = head;
+ }
+ head = head.next;
+ }
+ target.val++;
+ for (target = target.next; target; target = target.next) {
+ target.val = 0;
+ }
+ return dummy.val ? dummy : dummy.next;
+}
+```
+
diff --git a/solution/0300-0399/0369.Plus One Linked List/Solution.cpp b/solution/0300-0399/0369.Plus One Linked List/Solution.cpp
index d608df47aa497..4039ca6ce9ba2 100644
--- a/solution/0300-0399/0369.Plus One Linked List/Solution.cpp
+++ b/solution/0300-0399/0369.Plus One Linked List/Solution.cpp
@@ -13,16 +13,15 @@ class Solution {
ListNode* plusOne(ListNode* head) {
ListNode* dummy = new ListNode(0, head);
ListNode* target = dummy;
- while (head) {
- if (head->val != 9) target = head;
- head = head->next;
+ for (; head; head = head->next) {
+ if (head->val != 9) {
+ target = head;
+ }
}
- ++target->val;
- target = target->next;
- while (target) {
+ target->val++;
+ for (target = target->next; target; target = target->next) {
target->val = 0;
- target = target->next;
}
- return dummy->val == 1 ? dummy : dummy->next;
+ return dummy->val ? dummy : dummy->next;
}
};
\ No newline at end of file
diff --git a/solution/0300-0399/0369.Plus One Linked List/Solution.go b/solution/0300-0399/0369.Plus One Linked List/Solution.go
index 2cc181b636ae9..e391dafc75f0b 100644
--- a/solution/0300-0399/0369.Plus One Linked List/Solution.go
+++ b/solution/0300-0399/0369.Plus One Linked List/Solution.go
@@ -15,10 +15,8 @@ func plusOne(head *ListNode) *ListNode {
head = head.Next
}
target.Val++
- target = target.Next
- for target != nil {
+ for target = target.Next; target != nil; target = target.Next {
target.Val = 0
- target = target.Next
}
if dummy.Val == 1 {
return dummy
diff --git a/solution/0300-0399/0369.Plus One Linked List/Solution.py b/solution/0300-0399/0369.Plus One Linked List/Solution.py
index 39f094896af21..ee84db74fc160 100644
--- a/solution/0300-0399/0369.Plus One Linked List/Solution.py
+++ b/solution/0300-0399/0369.Plus One Linked List/Solution.py
@@ -4,7 +4,7 @@
# self.val = val
# self.next = next
class Solution:
- def plusOne(self, head: ListNode) -> ListNode:
+ def plusOne(self, head: Optional[ListNode]) -> Optional[ListNode]:
dummy = ListNode(0, head)
target = dummy
while head:
diff --git a/solution/0300-0399/0369.Plus One Linked List/Solution.ts b/solution/0300-0399/0369.Plus One Linked List/Solution.ts
new file mode 100644
index 0000000000000..81a3c64edb53c
--- /dev/null
+++ b/solution/0300-0399/0369.Plus One Linked List/Solution.ts
@@ -0,0 +1,27 @@
+/**
+ * Definition for singly-linked list.
+ * class ListNode {
+ * val: number
+ * next: ListNode | null
+ * constructor(val?: number, next?: ListNode | null) {
+ * this.val = (val===undefined ? 0 : val)
+ * this.next = (next===undefined ? null : next)
+ * }
+ * }
+ */
+
+function plusOne(head: ListNode | null): ListNode | null {
+ const dummy = new ListNode(0, head);
+ let target = dummy;
+ while (head) {
+ if (head.val !== 9) {
+ target = head;
+ }
+ head = head.next;
+ }
+ target.val++;
+ for (target = target.next; target; target = target.next) {
+ target.val = 0;
+ }
+ return dummy.val ? dummy : dummy.next;
+}
diff --git a/solution/0300-0399/0387.First Unique Character in a String/README.md b/solution/0300-0399/0387.First Unique Character in a String/README.md
index eb945630e5bfe..146df01e483fd 100644
--- a/solution/0300-0399/0387.First Unique Character in a String/README.md
+++ b/solution/0300-0399/0387.First Unique Character in a String/README.md
@@ -59,15 +59,13 @@ tags:
-### 方法一:数组或哈希表
+### 方法一:计数
-我们可以用数组或哈希表 $cnt$ 记录字符串 $s$ 中每个字符出现的次数。
+我们用一个哈希表或者一个长度为 $26$ 的数组 $\text{cnt}$ 来存储每个字符出现的次数,然后从头开始遍历每个字符 $\text{s[i]}$,如果 $\text{cnt[s[i]]}$ 为 $1$,则返回 $i$。
-然后我们再遍历字符串 $s$,当遍历到某个字符 $c$ 时,如果 $cnt[c]=1$,则说明 $c$ 是第一个不重复的字符,返回它的索引即可。
+遍历结束后,如果没有找到符合条件的字符,返回 $-1$。
-如果遍历完字符串 $s$ 仍然没有找到不重复的字符,返回 $-1$。
-
-时间复杂度 $O(n)$,空间复杂度 $O(\Sigma)$,其中 $\Sigma$ 是字符集的大小。
+时间复杂度 $O(n)$,其中 $n$ 是字符串的长度。空间复杂度 $O(|\Sigma|)$,其中 $\Sigma$ 是字符集,本题中字符集为小写字母,所以 $|\Sigma|=26$。
@@ -145,12 +143,12 @@ func firstUniqChar(s string) int {
```ts
function firstUniqChar(s: string): number {
- const cnt = new Array(26).fill(0);
+ const cnt = new Map();
for (const c of s) {
- cnt[c.charCodeAt(0) - 97]++;
+ cnt.set(c, (cnt.get(c) || 0) + 1);
}
- for (let i = 0; i < s.length; i++) {
- if (cnt[s.charCodeAt(i) - 97] === 1) {
+ for (let i = 0; i < s.length; ++i) {
+ if (cnt.get(s[i]) === 1) {
return i;
}
}
@@ -166,12 +164,12 @@ function firstUniqChar(s: string): number {
* @return {number}
*/
var firstUniqChar = function (s) {
- const cnt = new Array(26).fill(0);
+ const cnt = new Map();
for (const c of s) {
- ++cnt[c.charCodeAt() - 'a'.charCodeAt()];
+ cnt.set(c, (cnt.get(c) || 0) + 1);
}
for (let i = 0; i < s.length; ++i) {
- if (cnt[s[i].charCodeAt() - 'a'.charCodeAt()] === 1) {
+ if (cnt.get(s[i]) === 1) {
return i;
}
}
diff --git a/solution/0300-0399/0387.First Unique Character in a String/README_EN.md b/solution/0300-0399/0387.First Unique Character in a String/README_EN.md
index a86551f835c7c..a063045a0d345 100644
--- a/solution/0300-0399/0387.First Unique Character in a String/README_EN.md
+++ b/solution/0300-0399/0387.First Unique Character in a String/README_EN.md
@@ -64,7 +64,13 @@ tags:
-### Solution 1
+### Solution 1: Counting
+
+We use a hash table or an array of length $26$ $\text{cnt}$ to store the frequency of each character. Then, we traverse each character $\text{s[i]}$ from the beginning. If $\text{cnt[s[i]]}$ is $1$, we return $i$.
+
+If no such character is found after the traversal, we return $-1$.
+
+The time complexity is $O(n)$, where $n$ is the length of the string. The space complexity is $O(|\Sigma|)$, where $\Sigma$ is the character set. In this problem, the character set consists of lowercase letters, so $|\Sigma|=26$.
@@ -142,12 +148,12 @@ func firstUniqChar(s string) int {
```ts
function firstUniqChar(s: string): number {
- const cnt = new Array(26).fill(0);
+ const cnt = new Map();
for (const c of s) {
- cnt[c.charCodeAt(0) - 97]++;
+ cnt.set(c, (cnt.get(c) || 0) + 1);
}
- for (let i = 0; i < s.length; i++) {
- if (cnt[s.charCodeAt(i) - 97] === 1) {
+ for (let i = 0; i < s.length; ++i) {
+ if (cnt.get(s[i]) === 1) {
return i;
}
}
@@ -163,12 +169,12 @@ function firstUniqChar(s: string): number {
* @return {number}
*/
var firstUniqChar = function (s) {
- const cnt = new Array(26).fill(0);
+ const cnt = new Map();
for (const c of s) {
- ++cnt[c.charCodeAt() - 'a'.charCodeAt()];
+ cnt.set(c, (cnt.get(c) || 0) + 1);
}
for (let i = 0; i < s.length; ++i) {
- if (cnt[s[i].charCodeAt() - 'a'.charCodeAt()] === 1) {
+ if (cnt.get(s[i]) === 1) {
return i;
}
}
diff --git a/solution/0300-0399/0387.First Unique Character in a String/Solution.js b/solution/0300-0399/0387.First Unique Character in a String/Solution.js
index 9e12bbbdd828e..5ffe59f022aa8 100644
--- a/solution/0300-0399/0387.First Unique Character in a String/Solution.js
+++ b/solution/0300-0399/0387.First Unique Character in a String/Solution.js
@@ -3,12 +3,12 @@
* @return {number}
*/
var firstUniqChar = function (s) {
- const cnt = new Array(26).fill(0);
+ const cnt = new Map();
for (const c of s) {
- ++cnt[c.charCodeAt() - 'a'.charCodeAt()];
+ cnt.set(c, (cnt.get(c) || 0) + 1);
}
for (let i = 0; i < s.length; ++i) {
- if (cnt[s[i].charCodeAt() - 'a'.charCodeAt()] === 1) {
+ if (cnt.get(s[i]) === 1) {
return i;
}
}
diff --git a/solution/0300-0399/0387.First Unique Character in a String/Solution.ts b/solution/0300-0399/0387.First Unique Character in a String/Solution.ts
index 78be86adcfab1..8fb60cff78022 100644
--- a/solution/0300-0399/0387.First Unique Character in a String/Solution.ts
+++ b/solution/0300-0399/0387.First Unique Character in a String/Solution.ts
@@ -1,10 +1,10 @@
function firstUniqChar(s: string): number {
- const cnt = new Array(26).fill(0);
+ const cnt = new Map();
for (const c of s) {
- cnt[c.charCodeAt(0) - 97]++;
+ cnt.set(c, (cnt.get(c) || 0) + 1);
}
- for (let i = 0; i < s.length; i++) {
- if (cnt[s.charCodeAt(i) - 97] === 1) {
+ for (let i = 0; i < s.length; ++i) {
+ if (cnt.get(s[i]) === 1) {
return i;
}
}
diff --git a/solution/0400-0499/0434.Number of Segments in a String/README.md b/solution/0400-0499/0434.Number of Segments in a String/README.md
index bb68680de4334..97b8cf15f9b26 100644
--- a/solution/0400-0499/0434.Number of Segments in a String/README.md
+++ b/solution/0400-0499/0434.Number of Segments in a String/README.md
@@ -35,9 +35,9 @@ tags:
### 方法一:字符串分割
-将字符串 `s` 按照空格进行分割,然后统计不为空的单词个数。
+我们将字符串 $\textit{s}$ 按照空格进行分割,然后统计不为空的单词个数。
-时间复杂度 $O(n)$,空间复杂度 $O(n)$。
+时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为字符串 $\textit{s}$ 的长度。
@@ -93,6 +93,14 @@ func countSegments(s string) int {
}
```
+#### TypeScript
+
+```ts
+function countSegments(s: string): number {
+ return s.split(/\s+/).filter(Boolean).length;
+}
+```
+
#### PHP
```php
@@ -122,9 +130,11 @@ class Solution {
### 方法二:模拟
-直接模拟,遍历字符串,检测每个字符,统计个数。
+我们也可以直接遍历字符串的每个字符 $\text{s[i]}$,如果 $\text{s[i]}$ 不是空格且 $\text{s[i-1]}$ 是空格或者 $i = 0$,那么就说明 $\text{s[i]}$ 是一个新的单词的开始,我们就将答案加一。
-时间复杂度 $O(n)$,空间复杂度 $O(1)$。
+遍历结束后,返回答案即可。
+
+时间复杂度 $O(n)$,其中 $n$ 为字符串 $\textit{s}$ 的长度。空间复杂度 $O(1)$。
@@ -187,6 +197,43 @@ func countSegments(s string) int {
}
```
+#### TypeScript
+
+```ts
+function countSegments(s: string): number {
+ let ans = 0;
+ for (let i = 0; i < s.length; i++) {
+ let c = s[i];
+ if (c !== ' ' && (i === 0 || s[i - 1] === ' ')) {
+ ans++;
+ }
+ }
+ return ans;
+}
+```
+
+#### PHP
+
+```php
+class Solution {
+ /**
+ * @param String $s
+ * @return Integer
+ */
+ function countSegments($s) {
+ $ans = 0;
+ $n = strlen($s);
+ for ($i = 0; $i < $n; $i++) {
+ $c = $s[$i];
+ if ($c !== ' ' && ($i === 0 || $s[$i - 1] === ' ')) {
+ $ans++;
+ }
+ }
+ return $ans;
+ }
+}
+```
+
diff --git a/solution/0400-0499/0434.Number of Segments in a String/README_EN.md b/solution/0400-0499/0434.Number of Segments in a String/README_EN.md
index becc602f25288..de310aced515b 100644
--- a/solution/0400-0499/0434.Number of Segments in a String/README_EN.md
+++ b/solution/0400-0499/0434.Number of Segments in a String/README_EN.md
@@ -51,7 +51,11 @@ tags:
-### Solution 1
+### Solution 1: String Splitting
+
+We split the string $\textit{s}$ by spaces and then count the number of non-empty words.
+
+The time complexity is $O(n)$, and the space complexity is $O(n)$, where $n$ is the length of the string $\textit{s}$.
@@ -107,6 +111,14 @@ func countSegments(s string) int {
}
```
+#### TypeScript
+
+```ts
+function countSegments(s: string): number {
+ return s.split(/\s+/).filter(Boolean).length;
+}
+```
+
#### PHP
```php
@@ -134,7 +146,13 @@ class Solution {
-### Solution 2
+### Solution 2: Simulation
+
+We can also directly traverse each character $\text{s[i]}$ in the string. If $\text{s[i]}$ is not a space and $\text{s[i-1]}$ is a space or $i = 0$, then $\text{s[i]}$ marks the beginning of a new word, and we increment the answer by one.
+
+After the traversal, we return the answer.
+
+The time complexity is $O(n)$, where $n$ is the length of the string $\textit{s}$. The space complexity is $O(1)$.
@@ -197,6 +215,43 @@ func countSegments(s string) int {
}
```
+#### TypeScript
+
+```ts
+function countSegments(s: string): number {
+ let ans = 0;
+ for (let i = 0; i < s.length; i++) {
+ let c = s[i];
+ if (c !== ' ' && (i === 0 || s[i - 1] === ' ')) {
+ ans++;
+ }
+ }
+ return ans;
+}
+```
+
+#### PHP
+
+```php
+class Solution {
+ /**
+ * @param String $s
+ * @return Integer
+ */
+ function countSegments($s) {
+ $ans = 0;
+ $n = strlen($s);
+ for ($i = 0; $i < $n; $i++) {
+ $c = $s[$i];
+ if ($c !== ' ' && ($i === 0 || $s[$i - 1] === ' ')) {
+ $ans++;
+ }
+ }
+ return $ans;
+ }
+}
+```
+
diff --git a/solution/0400-0499/0434.Number of Segments in a String/Solution.ts b/solution/0400-0499/0434.Number of Segments in a String/Solution.ts
new file mode 100644
index 0000000000000..e31e039bb1416
--- /dev/null
+++ b/solution/0400-0499/0434.Number of Segments in a String/Solution.ts
@@ -0,0 +1,3 @@
+function countSegments(s: string): number {
+ return s.split(/\s+/).filter(Boolean).length;
+}
diff --git a/solution/0400-0499/0434.Number of Segments in a String/Solution2.php b/solution/0400-0499/0434.Number of Segments in a String/Solution2.php
new file mode 100644
index 0000000000000..70de51e4e781f
--- /dev/null
+++ b/solution/0400-0499/0434.Number of Segments in a String/Solution2.php
@@ -0,0 +1,17 @@
+class Solution {
+ /**
+ * @param String $s
+ * @return Integer
+ */
+ function countSegments($s) {
+ $ans = 0;
+ $n = strlen($s);
+ for ($i = 0; $i < $n; $i++) {
+ $c = $s[$i];
+ if ($c !== ' ' && ($i === 0 || $s[$i - 1] === ' ')) {
+ $ans++;
+ }
+ }
+ return $ans;
+ }
+}
\ No newline at end of file
diff --git a/solution/0400-0499/0434.Number of Segments in a String/Solution2.ts b/solution/0400-0499/0434.Number of Segments in a String/Solution2.ts
new file mode 100644
index 0000000000000..27613c80065e9
--- /dev/null
+++ b/solution/0400-0499/0434.Number of Segments in a String/Solution2.ts
@@ -0,0 +1,10 @@
+function countSegments(s: string): number {
+ let ans = 0;
+ for (let i = 0; i < s.length; i++) {
+ let c = s[i];
+ if (c !== ' ' && (i === 0 || s[i - 1] === ' ')) {
+ ans++;
+ }
+ }
+ return ans;
+}
diff --git a/solution/0400-0499/0435.Non-overlapping Intervals/README.md b/solution/0400-0499/0435.Non-overlapping Intervals/README.md
index d11d9c230875c..239271f1d1323 100644
--- a/solution/0400-0499/0435.Non-overlapping Intervals/README.md
+++ b/solution/0400-0499/0435.Non-overlapping Intervals/README.md
@@ -65,9 +65,18 @@ tags:
-### 方法一:转换为最长上升子序列问题
+### 方法一:排序 + 贪心
-最长上升子序列问题,动态规划的做法,时间复杂度是 $O(n^2)$,这里可以采用贪心优化,将复杂度降至 $O(n\log n)$。
+我们首先将区间按照右边界升序排序,用一个变量 $\textit{pre}$ 记录上一个区间的右边界,用一个变量 $\textit{ans}$ 记录需要移除的区间数量,初始时 $\textit{ans} = \textit{intervals.length}$。
+
+然后遍历区间,对于每一个区间:
+
+- 若当前区间的左边界大于等于 $\textit{pre}$,说明该区间无需移除,直接更新 $\textit{pre}$ 为当前区间的右边界,然后将 $\textit{ans}$ 减一;
+- 否则,说明该区间需要移除,不需要更新 $\textit{pre}$ 和 $\textit{ans}$。
+
+最后返回 $\textit{ans}$ 即可。
+
+时间复杂度 $O(n \times \log n)$,空间复杂度 $O(\log n)$。其中 $n$ 为区间的数量。
@@ -77,12 +86,12 @@ tags:
class Solution:
def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
intervals.sort(key=lambda x: x[1])
- ans, t = 0, intervals[0][1]
- for s, e in intervals[1:]:
- if s >= t:
- t = e
- else:
- ans += 1
+ ans = len(intervals)
+ pre = -inf
+ for l, r in intervals:
+ if pre <= l:
+ ans -= 1
+ pre = r
return ans
```
@@ -91,13 +100,14 @@ class Solution:
```java
class Solution {
public int eraseOverlapIntervals(int[][] intervals) {
- Arrays.sort(intervals, Comparator.comparingInt(a -> a[1]));
- int t = intervals[0][1], ans = 0;
- for (int i = 1; i < intervals.length; ++i) {
- if (intervals[i][0] >= t) {
- t = intervals[i][1];
- } else {
- ++ans;
+ Arrays.sort(intervals, (a, b) -> a[1] - b[1]);
+ int ans = intervals.length;
+ int pre = Integer.MIN_VALUE;
+ for (var e : intervals) {
+ int l = e[0], r = e[1];
+ if (pre <= l) {
+ --ans;
+ pre = r;
}
}
return ans;
@@ -111,13 +121,17 @@ class Solution {
class Solution {
public:
int eraseOverlapIntervals(vector>& intervals) {
- sort(intervals.begin(), intervals.end(), [](const auto& a, const auto& b) { return a[1] < b[1]; });
- int ans = 0, t = intervals[0][1];
- for (int i = 1; i < intervals.size(); ++i) {
- if (t <= intervals[i][0])
- t = intervals[i][1];
- else
- ++ans;
+ ranges::sort(intervals, [](const vector& a, const vector& b) {
+ return a[1] < b[1];
+ });
+ int ans = intervals.size();
+ int pre = INT_MIN;
+ for (const auto& e : intervals) {
+ int l = e[0], r = e[1];
+ if (pre <= l) {
+ --ans;
+ pre = r;
+ }
}
return ans;
}
@@ -131,12 +145,13 @@ func eraseOverlapIntervals(intervals [][]int) int {
sort.Slice(intervals, func(i, j int) bool {
return intervals[i][1] < intervals[j][1]
})
- t, ans := intervals[0][1], 0
- for i := 1; i < len(intervals); i++ {
- if intervals[i][0] >= t {
- t = intervals[i][1]
- } else {
- ans++
+ ans := len(intervals)
+ pre := math.MinInt32
+ for _, e := range intervals {
+ l, r := e[0], e[1]
+ if pre <= l {
+ ans--
+ pre = r
}
}
return ans
@@ -148,14 +163,11 @@ func eraseOverlapIntervals(intervals [][]int) int {
```ts
function eraseOverlapIntervals(intervals: number[][]): number {
intervals.sort((a, b) => a[1] - b[1]);
- let end = intervals[0][1],
- ans = 0;
- for (let i = 1; i < intervals.length; ++i) {
- let cur = intervals[i];
- if (end > cur[0]) {
- ans++;
- } else {
- end = cur[1];
+ let [ans, pre] = [intervals.length, -Infinity];
+ for (const [l, r] of intervals) {
+ if (pre <= l) {
+ --ans;
+ pre = r;
}
}
return ans;
@@ -166,76 +178,4 @@ function eraseOverlapIntervals(intervals: number[][]): number {
-
-
-### 方法二:排序 + 贪心
-
-先按照区间右边界排序。优先选择最小的区间的右边界作为起始边界。遍历区间:
-
-- 若当前区间左边界大于等于起始右边界,说明该区间无需移除,直接更新起始右边界;
-- 否则说明该区间需要移除,更新移除区间的数量 ans。
-
-最后返回 ans 即可。
-
-时间复杂度 $O(n\log n)$。
-
-
-
-#### Python3
-
-```python
-class Solution:
- def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
- intervals.sort()
- d = [intervals[0][1]]
- for s, e in intervals[1:]:
- if s >= d[-1]:
- d.append(e)
- else:
- idx = bisect_left(d, s)
- d[idx] = min(d[idx], e)
- return len(intervals) - len(d)
-```
-
-#### Java
-
-```java
-class Solution {
- public int eraseOverlapIntervals(int[][] intervals) {
- Arrays.sort(intervals, (a, b) -> {
- if (a[0] != b[0]) {
- return a[0] - b[0];
- }
- return a[1] - b[1];
- });
- int n = intervals.length;
- int[] d = new int[n + 1];
- d[1] = intervals[0][1];
- int size = 1;
- for (int i = 1; i < n; ++i) {
- int s = intervals[i][0], e = intervals[i][1];
- if (s >= d[size]) {
- d[++size] = e;
- } else {
- int left = 1, right = size;
- while (left < right) {
- int mid = (left + right) >> 1;
- if (d[mid] >= s) {
- right = mid;
- } else {
- left = mid + 1;
- }
- }
- d[left] = Math.min(d[left], e);
- }
- }
- return n - size;
- }
-}
-```
-
-
-
-
-
diff --git a/solution/0400-0499/0435.Non-overlapping Intervals/README_EN.md b/solution/0400-0499/0435.Non-overlapping Intervals/README_EN.md
index d4ea312a3852c..61a99a2fbd245 100644
--- a/solution/0400-0499/0435.Non-overlapping Intervals/README_EN.md
+++ b/solution/0400-0499/0435.Non-overlapping Intervals/README_EN.md
@@ -63,7 +63,18 @@ tags:
-### Solution 1
+### Solution 1: Sorting + Greedy
+
+We first sort the intervals in ascending order by their right boundary. We use a variable $\textit{pre}$ to record the right boundary of the previous interval and a variable $\textit{ans}$ to record the number of intervals that need to be removed. Initially, $\textit{ans} = \textit{intervals.length}$.
+
+Then we iterate through the intervals. For each interval:
+
+- If the left boundary of the current interval is greater than or equal to $\textit{pre}$, it means that this interval does not need to be removed. We directly update $\textit{pre}$ to the right boundary of the current interval and decrement $\textit{ans}$ by one;
+- Otherwise, it means that this interval needs to be removed, and we do not need to update $\textit{pre}$ and $\textit{ans}$.
+
+Finally, we return $\textit{ans}$.
+
+The time complexity is $O(n \times \log n)$, and the space complexity is $O(\log n)$, where $n$ is the number of intervals.
@@ -73,12 +84,12 @@ tags:
class Solution:
def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
intervals.sort(key=lambda x: x[1])
- ans, t = 0, intervals[0][1]
- for s, e in intervals[1:]:
- if s >= t:
- t = e
- else:
- ans += 1
+ ans = len(intervals)
+ pre = -inf
+ for l, r in intervals:
+ if pre <= l:
+ ans -= 1
+ pre = r
return ans
```
@@ -87,13 +98,14 @@ class Solution:
```java
class Solution {
public int eraseOverlapIntervals(int[][] intervals) {
- Arrays.sort(intervals, Comparator.comparingInt(a -> a[1]));
- int t = intervals[0][1], ans = 0;
- for (int i = 1; i < intervals.length; ++i) {
- if (intervals[i][0] >= t) {
- t = intervals[i][1];
- } else {
- ++ans;
+ Arrays.sort(intervals, (a, b) -> a[1] - b[1]);
+ int ans = intervals.length;
+ int pre = Integer.MIN_VALUE;
+ for (var e : intervals) {
+ int l = e[0], r = e[1];
+ if (pre <= l) {
+ --ans;
+ pre = r;
}
}
return ans;
@@ -107,13 +119,17 @@ class Solution {
class Solution {
public:
int eraseOverlapIntervals(vector>& intervals) {
- sort(intervals.begin(), intervals.end(), [](const auto& a, const auto& b) { return a[1] < b[1]; });
- int ans = 0, t = intervals[0][1];
- for (int i = 1; i < intervals.size(); ++i) {
- if (t <= intervals[i][0])
- t = intervals[i][1];
- else
- ++ans;
+ ranges::sort(intervals, [](const vector& a, const vector& b) {
+ return a[1] < b[1];
+ });
+ int ans = intervals.size();
+ int pre = INT_MIN;
+ for (const auto& e : intervals) {
+ int l = e[0], r = e[1];
+ if (pre <= l) {
+ --ans;
+ pre = r;
+ }
}
return ans;
}
@@ -127,12 +143,13 @@ func eraseOverlapIntervals(intervals [][]int) int {
sort.Slice(intervals, func(i, j int) bool {
return intervals[i][1] < intervals[j][1]
})
- t, ans := intervals[0][1], 0
- for i := 1; i < len(intervals); i++ {
- if intervals[i][0] >= t {
- t = intervals[i][1]
- } else {
- ans++
+ ans := len(intervals)
+ pre := math.MinInt32
+ for _, e := range intervals {
+ l, r := e[0], e[1]
+ if pre <= l {
+ ans--
+ pre = r
}
}
return ans
@@ -144,14 +161,11 @@ func eraseOverlapIntervals(intervals [][]int) int {
```ts
function eraseOverlapIntervals(intervals: number[][]): number {
intervals.sort((a, b) => a[1] - b[1]);
- let end = intervals[0][1],
- ans = 0;
- for (let i = 1; i < intervals.length; ++i) {
- let cur = intervals[i];
- if (end > cur[0]) {
- ans++;
- } else {
- end = cur[1];
+ let [ans, pre] = [intervals.length, -Infinity];
+ for (const [l, r] of intervals) {
+ if (pre <= l) {
+ --ans;
+ pre = r;
}
}
return ans;
@@ -162,67 +176,4 @@ function eraseOverlapIntervals(intervals: number[][]): number {
-
-
-### Solution 2
-
-
-
-#### Python3
-
-```python
-class Solution:
- def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
- intervals.sort()
- d = [intervals[0][1]]
- for s, e in intervals[1:]:
- if s >= d[-1]:
- d.append(e)
- else:
- idx = bisect_left(d, s)
- d[idx] = min(d[idx], e)
- return len(intervals) - len(d)
-```
-
-#### Java
-
-```java
-class Solution {
- public int eraseOverlapIntervals(int[][] intervals) {
- Arrays.sort(intervals, (a, b) -> {
- if (a[0] != b[0]) {
- return a[0] - b[0];
- }
- return a[1] - b[1];
- });
- int n = intervals.length;
- int[] d = new int[n + 1];
- d[1] = intervals[0][1];
- int size = 1;
- for (int i = 1; i < n; ++i) {
- int s = intervals[i][0], e = intervals[i][1];
- if (s >= d[size]) {
- d[++size] = e;
- } else {
- int left = 1, right = size;
- while (left < right) {
- int mid = (left + right) >> 1;
- if (d[mid] >= s) {
- right = mid;
- } else {
- left = mid + 1;
- }
- }
- d[left] = Math.min(d[left], e);
- }
- }
- return n - size;
- }
-}
-```
-
-
-
-
-
diff --git a/solution/0400-0499/0435.Non-overlapping Intervals/Solution.cpp b/solution/0400-0499/0435.Non-overlapping Intervals/Solution.cpp
index e754f1db36a3a..f362aa4fee404 100644
--- a/solution/0400-0499/0435.Non-overlapping Intervals/Solution.cpp
+++ b/solution/0400-0499/0435.Non-overlapping Intervals/Solution.cpp
@@ -1,14 +1,18 @@
class Solution {
public:
int eraseOverlapIntervals(vector>& intervals) {
- sort(intervals.begin(), intervals.end(), [](const auto& a, const auto& b) { return a[1] < b[1]; });
- int ans = 0, t = intervals[0][1];
- for (int i = 1; i < intervals.size(); ++i) {
- if (t <= intervals[i][0])
- t = intervals[i][1];
- else
- ++ans;
+ ranges::sort(intervals, [](const vector& a, const vector& b) {
+ return a[1] < b[1];
+ });
+ int ans = intervals.size();
+ int pre = INT_MIN;
+ for (const auto& e : intervals) {
+ int l = e[0], r = e[1];
+ if (pre <= l) {
+ --ans;
+ pre = r;
+ }
}
return ans;
}
-};
\ No newline at end of file
+};
diff --git a/solution/0400-0499/0435.Non-overlapping Intervals/Solution.go b/solution/0400-0499/0435.Non-overlapping Intervals/Solution.go
index d40eb5b6378ed..16085cd32cfb7 100644
--- a/solution/0400-0499/0435.Non-overlapping Intervals/Solution.go
+++ b/solution/0400-0499/0435.Non-overlapping Intervals/Solution.go
@@ -2,13 +2,14 @@ func eraseOverlapIntervals(intervals [][]int) int {
sort.Slice(intervals, func(i, j int) bool {
return intervals[i][1] < intervals[j][1]
})
- t, ans := intervals[0][1], 0
- for i := 1; i < len(intervals); i++ {
- if intervals[i][0] >= t {
- t = intervals[i][1]
- } else {
- ans++
+ ans := len(intervals)
+ pre := math.MinInt32
+ for _, e := range intervals {
+ l, r := e[0], e[1]
+ if pre <= l {
+ ans--
+ pre = r
}
}
return ans
-}
\ No newline at end of file
+}
diff --git a/solution/0400-0499/0435.Non-overlapping Intervals/Solution.java b/solution/0400-0499/0435.Non-overlapping Intervals/Solution.java
index 06940f1be5f62..907073e547ef1 100644
--- a/solution/0400-0499/0435.Non-overlapping Intervals/Solution.java
+++ b/solution/0400-0499/0435.Non-overlapping Intervals/Solution.java
@@ -1,14 +1,15 @@
class Solution {
public int eraseOverlapIntervals(int[][] intervals) {
- Arrays.sort(intervals, Comparator.comparingInt(a -> a[1]));
- int t = intervals[0][1], ans = 0;
- for (int i = 1; i < intervals.length; ++i) {
- if (intervals[i][0] >= t) {
- t = intervals[i][1];
- } else {
- ++ans;
+ Arrays.sort(intervals, (a, b) -> a[1] - b[1]);
+ int ans = intervals.length;
+ int pre = Integer.MIN_VALUE;
+ for (var e : intervals) {
+ int l = e[0], r = e[1];
+ if (pre <= l) {
+ --ans;
+ pre = r;
}
}
return ans;
}
-}
\ No newline at end of file
+}
diff --git a/solution/0400-0499/0435.Non-overlapping Intervals/Solution.py b/solution/0400-0499/0435.Non-overlapping Intervals/Solution.py
index d599421163958..55d4b26112c33 100644
--- a/solution/0400-0499/0435.Non-overlapping Intervals/Solution.py
+++ b/solution/0400-0499/0435.Non-overlapping Intervals/Solution.py
@@ -1,10 +1,10 @@
class Solution:
def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
intervals.sort(key=lambda x: x[1])
- ans, t = 0, intervals[0][1]
- for s, e in intervals[1:]:
- if s >= t:
- t = e
- else:
- ans += 1
+ ans = len(intervals)
+ pre = -inf
+ for l, r in intervals:
+ if pre <= l:
+ ans -= 1
+ pre = r
return ans
diff --git a/solution/0400-0499/0435.Non-overlapping Intervals/Solution.ts b/solution/0400-0499/0435.Non-overlapping Intervals/Solution.ts
index d10fa2a880de6..9e6ced4c9275e 100644
--- a/solution/0400-0499/0435.Non-overlapping Intervals/Solution.ts
+++ b/solution/0400-0499/0435.Non-overlapping Intervals/Solution.ts
@@ -1,13 +1,10 @@
function eraseOverlapIntervals(intervals: number[][]): number {
intervals.sort((a, b) => a[1] - b[1]);
- let end = intervals[0][1],
- ans = 0;
- for (let i = 1; i < intervals.length; ++i) {
- let cur = intervals[i];
- if (end > cur[0]) {
- ans++;
- } else {
- end = cur[1];
+ let [ans, pre] = [intervals.length, -Infinity];
+ for (const [l, r] of intervals) {
+ if (pre <= l) {
+ --ans;
+ pre = r;
}
}
return ans;
diff --git a/solution/0400-0499/0435.Non-overlapping Intervals/Solution2.java b/solution/0400-0499/0435.Non-overlapping Intervals/Solution2.java
deleted file mode 100644
index 3db74098111b5..0000000000000
--- a/solution/0400-0499/0435.Non-overlapping Intervals/Solution2.java
+++ /dev/null
@@ -1,32 +0,0 @@
-class Solution {
- public int eraseOverlapIntervals(int[][] intervals) {
- Arrays.sort(intervals, (a, b) -> {
- if (a[0] != b[0]) {
- return a[0] - b[0];
- }
- return a[1] - b[1];
- });
- int n = intervals.length;
- int[] d = new int[n + 1];
- d[1] = intervals[0][1];
- int size = 1;
- for (int i = 1; i < n; ++i) {
- int s = intervals[i][0], e = intervals[i][1];
- if (s >= d[size]) {
- d[++size] = e;
- } else {
- int left = 1, right = size;
- while (left < right) {
- int mid = (left + right) >> 1;
- if (d[mid] >= s) {
- right = mid;
- } else {
- left = mid + 1;
- }
- }
- d[left] = Math.min(d[left], e);
- }
- }
- return n - size;
- }
-}
\ No newline at end of file
diff --git a/solution/0400-0499/0435.Non-overlapping Intervals/Solution2.py b/solution/0400-0499/0435.Non-overlapping Intervals/Solution2.py
deleted file mode 100644
index 8b41845673b4f..0000000000000
--- a/solution/0400-0499/0435.Non-overlapping Intervals/Solution2.py
+++ /dev/null
@@ -1,11 +0,0 @@
-class Solution:
- def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
- intervals.sort()
- d = [intervals[0][1]]
- for s, e in intervals[1:]:
- if s >= d[-1]:
- d.append(e)
- else:
- idx = bisect_left(d, s)
- d[idx] = min(d[idx], e)
- return len(intervals) - len(d)
diff --git a/solution/0400-0499/0486.Predict the Winner/README.md b/solution/0400-0499/0486.Predict the Winner/README.md
index 9a5613b1b103c..3750696c8f78e 100644
--- a/solution/0400-0499/0486.Predict the Winner/README.md
+++ b/solution/0400-0499/0486.Predict the Winner/README.md
@@ -63,18 +63,18 @@ tags:
### 方法一:记忆化搜索
-我们设计一个函数 $dfs(i, j)$,表示从第 $i$ 个数到第 $j$ 个数,当前玩家与另一个玩家的得分之差的最大值。那么答案就是 $dfs(0, n - 1) \gt 0$。
+我们设计一个函数 $\textit{dfs}(i, j)$,表示从第 $i$ 个数到第 $j$ 个数,当前玩家与另一个玩家的得分之差的最大值。那么答案就是 $\textit{dfs}(0, n - 1) \geq 0$。
-函数 $dfs(i, j)$ 的计算方法如下:
+函数 $\textit{dfs}(i, j)$ 的计算方法如下:
-- 如果 $i \gt j$,说明当前没有数字了,所以当前玩家没有分数可以拿,差值为 $0$,即 $dfs(i, j) = 0$。
-- 否则,当前玩家有两种选择,如果选择第 $i$ 个数,那么当前玩家与另一个玩家的得分之差为 $nums[i] - dfs(i + 1, j)$;如果选择第 $j$ 个数,那么当前玩家与另一个玩家的得分之差为 $nums[j] - dfs(i, j - 1)$。当前玩家会选择两种情况中差值较大的情况,也就是说 $dfs(i, j) = \max(nums[i] - dfs(i + 1, j), nums[j] - dfs(i, j - 1))$。
+- 如果 $i > j$,说明当前没有数字了,所以当前玩家没有分数可以拿,差值为 $0$,即 $\textit{dfs}(i, j) = 0$。
+- 否则,当前玩家有两种选择,如果选择第 $i$ 个数,那么当前玩家与另一个玩家的得分之差为 $\textit{nums}[i] - \textit{dfs}(i + 1, j)$;如果选择第 $j$ 个数,那么当前玩家与另一个玩家的得分之差为 $\textit{nums}[j] - \textit{dfs}(i, j - 1)$。当前玩家会选择两种情况中差值较大的情况,也就是说 $\textit{dfs}(i, j) = \max(\textit{nums}[i] - \textit{dfs}(i + 1, j), \textit{nums}[j] - \textit{dfs}(i, j - 1))$。
-最后,我们只需要判断 $dfs(0, n - 1) \gt 0$ 即可。
+最后,我们只需要判断 $\textit{dfs}(0, n - 1) \geq 0$ 即可。
-为了避免重复计算,我们可以使用记忆化搜索的方法,用一个数组 $f$ 记录所有的 $dfs(i, j)$ 的值,当函数再次被调用到时,我们可以直接从 $f$ 中取出答案而不需要重新计算。
+为了避免重复计算,我们可以使用记忆化搜索的方法,用一个数组 $f$ 记录所有的 $\textit{dfs}(i, j)$ 的值,当函数再次被调用到时,我们可以直接从 $f$ 中取出答案而不需要重新计算。
-时间复杂度 $O(n^2)$,空间复杂度 $O(n^2)$。其中 $n$ 是数组的长度。
+时间复杂度 $O(n^2)$,空间复杂度 $O(n^2)$。其中 $n$ 是数组 $\textit{nums}$ 的长度。
@@ -82,7 +82,7 @@ tags:
```python
class Solution:
- def PredictTheWinner(self, nums: List[int]) -> bool:
+ def predictTheWinner(self, nums: List[int]) -> bool:
@cache
def dfs(i: int, j: int) -> int:
if i > j:
@@ -99,7 +99,7 @@ class Solution {
private int[] nums;
private int[][] f;
- public boolean PredictTheWinner(int[] nums) {
+ public boolean predictTheWinner(int[] nums) {
this.nums = nums;
int n = nums.length;
f = new int[n][n];
@@ -123,11 +123,10 @@ class Solution {
```cpp
class Solution {
public:
- bool PredictTheWinner(vector& nums) {
+ bool predictTheWinner(vector& nums) {
int n = nums.size();
- int f[n][n];
- memset(f, 0, sizeof(f));
- function dfs = [&](int i, int j) -> int {
+ vector> f(n, vector(n));
+ auto dfs = [&](this auto&& dfs, int i, int j) -> int {
if (i > j) {
return 0;
}
@@ -144,7 +143,7 @@ public:
#### Go
```go
-func PredictTheWinner(nums []int) bool {
+func predictTheWinner(nums []int) bool {
n := len(nums)
f := make([][]int, n)
for i := range f {
@@ -167,9 +166,9 @@ func PredictTheWinner(nums []int) bool {
#### TypeScript
```ts
-function PredictTheWinner(nums: number[]): boolean {
+function predictTheWinner(nums: number[]): boolean {
const n = nums.length;
- const f: number[][] = new Array(n).fill(0).map(() => new Array(n).fill(0));
+ const f: number[][] = Array.from({ length: n }, () => Array(n).fill(0));
const dfs = (i: number, j: number): number => {
if (i > j) {
return 0;
@@ -187,29 +186,24 @@ function PredictTheWinner(nums: number[]): boolean {
```rust
impl Solution {
- #[allow(dead_code)]
pub fn predict_the_winner(nums: Vec) -> bool {
let n = nums.len();
- let mut dp: Vec> = vec![vec![0; n]; n];
+ let mut f = vec![vec![0; n]; n];
+ Self::dfs(&nums, &mut f, 0, n - 1) >= 0
+ }
- // Initialize the dp vector
- for i in 0..n {
- dp[i][i] = nums[i];
+ fn dfs(nums: &Vec, f: &mut Vec>, i: usize, j: usize) -> i32 {
+ if i == j {
+ return nums[i] as i32;
}
-
- // Begin the dp process
- for i in (0..n - 1).rev() {
- for j in i + 1..n {
- dp[i][j] = std::cmp::max(
- // Take i-th num
- nums[i] - dp[i + 1][j],
- // Take j-th num
- nums[j] - dp[i][j - 1],
- );
- }
+ if f[i][j] != 0 {
+ return f[i][j];
}
-
- dp[0][n - 1] >= 0
+ f[i][j] = std::cmp::max(
+ nums[i] - Self::dfs(nums, f, i + 1, j),
+ nums[j] - Self::dfs(nums, f, i, j - 1)
+ );
+ f[i][j]
}
}
```
@@ -222,20 +216,20 @@ impl Solution {
### 方法二:动态规划
-我们也可以使用动态规划的方法,定义 $f[i][j]$ 表示当前玩家在 $nums[i..j]$ 这些数字中能够获得的最大得分的差值。那么最后答案就是 $f[0][n - 1] \gt 0$。
+我们也可以使用动态规划的方法,定义 $f[i][j]$ 表示当前玩家在 $\textit{nums}[i..j]$ 这些数字中能够获得的最大得分的差值。那么最后答案就是 $f[0][n - 1] \geq 0$。
-初始时 $f[i][i]=nums[i]$,因为只有一个数,所以当前玩家只能拿取这个数,得分差值为 $nums[i]$。
+初始时 $f[i][i]=\textit{nums}[i]$,因为只有一个数,所以当前玩家只能拿取这个数,得分差值为 $\textit{nums}[i]$。
-考虑 $f[i][j]$,其中 $i \lt j$,有两种情况:
+考虑 $f[i][j]$,其中 $i < j$,有两种情况:
-- 如果当前玩家拿走了 $nums[i]$,那么剩下的数字为 $nums[i + 1..j]$,此时轮到另一个玩家进行游戏,所以 $f[i][j] = nums[i] - f[i + 1][j]$。
-- 如果当前玩家拿走了 $nums[j]$,那么剩下的数字为 $nums[i..j - 1]$,此时轮到另一个玩家进行游戏,所以 $f[i][j] = nums[j] - f[i][j - 1]$。
+- 如果当前玩家拿走了 $\textit{nums}[i]$,那么剩下的数字为 $\textit{nums}[i + 1..j]$,此时轮到另一个玩家进行游戏,所以 $f[i][j] = \textit{nums}[i] - f[i + 1][j]$。
+- 如果当前玩家拿走了 $\textit{nums}[j]$,那么剩下的数字为 $\textit{nums}[i..j - 1]$,此时轮到另一个玩家进行游戏,所以 $f[i][j] = \textit{nums}[j] - f[i][j - 1]$。
-因此,最终的状态转移方程为 $f[i][j] = \max(nums[i] - f[i + 1][j], nums[j] - f[i][j - 1])$。
+因此,最终的状态转移方程为 $f[i][j] = \max(\textit{nums}[i] - f[i + 1][j], \textit{nums}[j] - f[i][j - 1])$。
-最后,我们只需要判断 $f[0][n - 1] \gt 0$ 即可。
+最后,我们只需要判断 $f[0][n - 1] \geq 0$ 即可。
-时间复杂度 $O(n^2)$,空间复杂度 $O(n^2)$。其中 $n$ 是数组的长度。
+时间复杂度 $O(n^2)$,空间复杂度 $O(n^2)$。其中 $n$ 是数组 $\textit{nums}$ 的长度。
相似题目:
@@ -247,7 +241,7 @@ impl Solution {
```python
class Solution:
- def PredictTheWinner(self, nums: List[int]) -> bool:
+ def predictTheWinner(self, nums: List[int]) -> bool:
n = len(nums)
f = [[0] * n for _ in range(n)]
for i, x in enumerate(nums):
@@ -262,7 +256,7 @@ class Solution:
```java
class Solution {
- public boolean PredictTheWinner(int[] nums) {
+ public boolean predictTheWinner(int[] nums) {
int n = nums.length;
int[][] f = new int[n][n];
for (int i = 0; i < n; ++i) {
@@ -283,7 +277,7 @@ class Solution {
```cpp
class Solution {
public:
- bool PredictTheWinner(vector& nums) {
+ bool predictTheWinner(vector& nums) {
int n = nums.size();
int f[n][n];
memset(f, 0, sizeof(f));
@@ -303,7 +297,7 @@ public:
#### Go
```go
-func PredictTheWinner(nums []int) bool {
+func predictTheWinner(nums []int) bool {
n := len(nums)
f := make([][]int, n)
for i, x := range nums {
@@ -322,9 +316,9 @@ func PredictTheWinner(nums []int) bool {
#### TypeScript
```ts
-function PredictTheWinner(nums: number[]): boolean {
+function predictTheWinner(nums: number[]): boolean {
const n = nums.length;
- const f: number[][] = new Array(n).fill(0).map(() => new Array(n).fill(0));
+ const f: number[][] = Array.from({ length: n }, () => Array(n).fill(0));
for (let i = 0; i < n; ++i) {
f[i][i] = nums[i];
}
@@ -337,6 +331,29 @@ function PredictTheWinner(nums: number[]): boolean {
}
```
+#### Rust
+
+```rust
+impl Solution {
+ pub fn predict_the_winner(nums: Vec) -> bool {
+ let n = nums.len();
+ let mut f = vec![vec![0; n]; n];
+
+ for i in 0..n {
+ f[i][i] = nums[i];
+ }
+
+ for i in (0..n - 1).rev() {
+ for j in i + 1..n {
+ f[i][j] = std::cmp::max(nums[i] - f[i + 1][j], nums[j] - f[i][j - 1]);
+ }
+ }
+
+ f[0][n - 1] >= 0
+ }
+}
+```
+
diff --git a/solution/0400-0499/0486.Predict the Winner/README_EN.md b/solution/0400-0499/0486.Predict the Winner/README_EN.md
index 88171f6b2f1b1..187dde4159126 100644
--- a/solution/0400-0499/0486.Predict the Winner/README_EN.md
+++ b/solution/0400-0499/0486.Predict the Winner/README_EN.md
@@ -61,7 +61,20 @@ Finally, player 1 has more score (234) than player 2 (12), so you need to return
-### Solution 1
+### Solution 1: Memoization Search
+
+We design a function $\textit{dfs}(i, j)$, which represents the maximum difference in scores between the current player and the other player from the $i$-th number to the $j$-th number. The answer is $\textit{dfs}(0, n - 1) \geq 0$.
+
+The function $\textit{dfs}(i, j)$ is calculated as follows:
+
+- If $i > j$, it means there are no numbers left, so the current player cannot take any points, and the difference is $0$, i.e., $\textit{dfs}(i, j) = 0$.
+- Otherwise, the current player has two choices. If they choose the $i$-th number, the difference in scores between the current player and the other player is $\textit{nums}[i] - \textit{dfs}(i + 1, j)$. If they choose the $j$-th number, the difference in scores between the current player and the other player is $\textit{nums}[j] - \textit{dfs}(i, j - 1)$. The current player will choose the option with the larger difference, so $\textit{dfs}(i, j) = \max(\textit{nums}[i] - \textit{dfs}(i + 1, j), \textit{nums}[j] - \textit{dfs}(i, j - 1))$.
+
+Finally, we only need to check if $\textit{dfs}(0, n - 1) \geq 0$.
+
+To avoid repeated calculations, we can use memoization. We use an array $f$ to record all the values of $\textit{dfs}(i, j)$. When the function is called again, we can directly retrieve the answer from $f$ without recalculating it.
+
+The time complexity is $O(n^2)$, and the space complexity is $O(n^2)$. Here, $n$ is the length of the array $\textit{nums}$.
@@ -69,7 +82,7 @@ Finally, player 1 has more score (234) than player 2 (12), so you need to return
```python
class Solution:
- def PredictTheWinner(self, nums: List[int]) -> bool:
+ def predictTheWinner(self, nums: List[int]) -> bool:
@cache
def dfs(i: int, j: int) -> int:
if i > j:
@@ -86,7 +99,7 @@ class Solution {
private int[] nums;
private int[][] f;
- public boolean PredictTheWinner(int[] nums) {
+ public boolean predictTheWinner(int[] nums) {
this.nums = nums;
int n = nums.length;
f = new int[n][n];
@@ -110,11 +123,10 @@ class Solution {
```cpp
class Solution {
public:
- bool PredictTheWinner(vector& nums) {
+ bool predictTheWinner(vector& nums) {
int n = nums.size();
- int f[n][n];
- memset(f, 0, sizeof(f));
- function dfs = [&](int i, int j) -> int {
+ vector> f(n, vector(n));
+ auto dfs = [&](this auto&& dfs, int i, int j) -> int {
if (i > j) {
return 0;
}
@@ -131,7 +143,7 @@ public:
#### Go
```go
-func PredictTheWinner(nums []int) bool {
+func predictTheWinner(nums []int) bool {
n := len(nums)
f := make([][]int, n)
for i := range f {
@@ -154,9 +166,9 @@ func PredictTheWinner(nums []int) bool {
#### TypeScript
```ts
-function PredictTheWinner(nums: number[]): boolean {
+function predictTheWinner(nums: number[]): boolean {
const n = nums.length;
- const f: number[][] = new Array(n).fill(0).map(() => new Array(n).fill(0));
+ const f: number[][] = Array.from({ length: n }, () => Array(n).fill(0));
const dfs = (i: number, j: number): number => {
if (i > j) {
return 0;
@@ -174,29 +186,24 @@ function PredictTheWinner(nums: number[]): boolean {
```rust
impl Solution {
- #[allow(dead_code)]
pub fn predict_the_winner(nums: Vec) -> bool {
let n = nums.len();
- let mut dp: Vec> = vec![vec![0; n]; n];
+ let mut f = vec![vec![0; n]; n];
+ Self::dfs(&nums, &mut f, 0, n - 1) >= 0
+ }
- // Initialize the dp vector
- for i in 0..n {
- dp[i][i] = nums[i];
+ fn dfs(nums: &Vec, f: &mut Vec>, i: usize, j: usize) -> i32 {
+ if i == j {
+ return nums[i] as i32;
}
-
- // Begin the dp process
- for i in (0..n - 1).rev() {
- for j in i + 1..n {
- dp[i][j] = std::cmp::max(
- // Take i-th num
- nums[i] - dp[i + 1][j],
- // Take j-th num
- nums[j] - dp[i][j - 1],
- );
- }
+ if f[i][j] != 0 {
+ return f[i][j];
}
-
- dp[0][n - 1] >= 0
+ f[i][j] = std::cmp::max(
+ nums[i] - Self::dfs(nums, f, i + 1, j),
+ nums[j] - Self::dfs(nums, f, i, j - 1)
+ );
+ f[i][j]
}
}
```
@@ -207,7 +214,26 @@ impl Solution {
-### Solution 2
+### Solution 2: Dynamic Programming
+
+We can also use dynamic programming. Define $f[i][j]$ to represent the maximum score difference the current player can achieve in the range $\textit{nums}[i..j]$. The final answer is $f[0][n - 1] \geq 0$.
+
+Initially, $f[i][i] = \textit{nums}[i]$, because with only one number, the current player can only take that number, and the score difference is $\textit{nums}[i]$.
+
+Consider $f[i][j]$ where $i < j$, there are two cases:
+
+- If the current player takes $\textit{nums}[i]$, the remaining numbers are $\textit{nums}[i + 1..j]$, and it is the other player's turn. So, $f[i][j] = \textit{nums}[i] - f[i + 1][j]$.
+- If the current player takes $\textit{nums}[j]$, the remaining numbers are $\textit{nums}[i..j - 1]$, and it is the other player's turn. So, $f[i][j] = \textit{nums}[j] - f[i][j - 1]$.
+
+Therefore, the state transition equation is $f[i][j] = \max(\textit{nums}[i] - f[i + 1][j], \textit{nums}[j] - f[i][j - 1])$.
+
+Finally, we only need to check if $f[0][n - 1] \geq 0$.
+
+The time complexity is $O(n^2)$, and the space complexity is $O(n^2)$. Here, $n$ is the length of the array $\textit{nums}$.
+
+Similar problem:
+
+- [877. Stone Game](https://github.com/doocs/leetcode/blob/main/solution/0800-0899/0877.Stone%20Game/README_EN.md)
@@ -215,7 +241,7 @@ impl Solution {
```python
class Solution:
- def PredictTheWinner(self, nums: List[int]) -> bool:
+ def predictTheWinner(self, nums: List[int]) -> bool:
n = len(nums)
f = [[0] * n for _ in range(n)]
for i, x in enumerate(nums):
@@ -230,7 +256,7 @@ class Solution:
```java
class Solution {
- public boolean PredictTheWinner(int[] nums) {
+ public boolean predictTheWinner(int[] nums) {
int n = nums.length;
int[][] f = new int[n][n];
for (int i = 0; i < n; ++i) {
@@ -251,7 +277,7 @@ class Solution {
```cpp
class Solution {
public:
- bool PredictTheWinner(vector& nums) {
+ bool predictTheWinner(vector& nums) {
int n = nums.size();
int f[n][n];
memset(f, 0, sizeof(f));
@@ -271,7 +297,7 @@ public:
#### Go
```go
-func PredictTheWinner(nums []int) bool {
+func predictTheWinner(nums []int) bool {
n := len(nums)
f := make([][]int, n)
for i, x := range nums {
@@ -290,9 +316,9 @@ func PredictTheWinner(nums []int) bool {
#### TypeScript
```ts
-function PredictTheWinner(nums: number[]): boolean {
+function predictTheWinner(nums: number[]): boolean {
const n = nums.length;
- const f: number[][] = new Array(n).fill(0).map(() => new Array(n).fill(0));
+ const f: number[][] = Array.from({ length: n }, () => Array(n).fill(0));
for (let i = 0; i < n; ++i) {
f[i][i] = nums[i];
}
@@ -305,6 +331,29 @@ function PredictTheWinner(nums: number[]): boolean {
}
```
+#### Rust
+
+```rust
+impl Solution {
+ pub fn predict_the_winner(nums: Vec) -> bool {
+ let n = nums.len();
+ let mut f = vec![vec![0; n]; n];
+
+ for i in 0..n {
+ f[i][i] = nums[i];
+ }
+
+ for i in (0..n - 1).rev() {
+ for j in i + 1..n {
+ f[i][j] = std::cmp::max(nums[i] - f[i + 1][j], nums[j] - f[i][j - 1]);
+ }
+ }
+
+ f[0][n - 1] >= 0
+ }
+}
+```
+
diff --git a/solution/0400-0499/0486.Predict the Winner/Solution.cpp b/solution/0400-0499/0486.Predict the Winner/Solution.cpp
index 58f6253f0ffdb..e25e23d7b9fb4 100644
--- a/solution/0400-0499/0486.Predict the Winner/Solution.cpp
+++ b/solution/0400-0499/0486.Predict the Winner/Solution.cpp
@@ -1,10 +1,9 @@
class Solution {
public:
- bool PredictTheWinner(vector& nums) {
+ bool predictTheWinner(vector& nums) {
int n = nums.size();
- int f[n][n];
- memset(f, 0, sizeof(f));
- function dfs = [&](int i, int j) -> int {
+ vector> f(n, vector(n));
+ auto dfs = [&](this auto&& dfs, int i, int j) -> int {
if (i > j) {
return 0;
}
diff --git a/solution/0400-0499/0486.Predict the Winner/Solution.go b/solution/0400-0499/0486.Predict the Winner/Solution.go
index d9d1cb82a6a71..2f2229a5586e8 100644
--- a/solution/0400-0499/0486.Predict the Winner/Solution.go
+++ b/solution/0400-0499/0486.Predict the Winner/Solution.go
@@ -1,4 +1,4 @@
-func PredictTheWinner(nums []int) bool {
+func predictTheWinner(nums []int) bool {
n := len(nums)
f := make([][]int, n)
for i := range f {
diff --git a/solution/0400-0499/0486.Predict the Winner/Solution.java b/solution/0400-0499/0486.Predict the Winner/Solution.java
index 7cd2834256a20..eaf68e12830ed 100644
--- a/solution/0400-0499/0486.Predict the Winner/Solution.java
+++ b/solution/0400-0499/0486.Predict the Winner/Solution.java
@@ -2,7 +2,7 @@ class Solution {
private int[] nums;
private int[][] f;
- public boolean PredictTheWinner(int[] nums) {
+ public boolean predictTheWinner(int[] nums) {
this.nums = nums;
int n = nums.length;
f = new int[n][n];
diff --git a/solution/0400-0499/0486.Predict the Winner/Solution.py b/solution/0400-0499/0486.Predict the Winner/Solution.py
index 577b203921414..ded115095a38a 100644
--- a/solution/0400-0499/0486.Predict the Winner/Solution.py
+++ b/solution/0400-0499/0486.Predict the Winner/Solution.py
@@ -1,5 +1,5 @@
class Solution:
- def PredictTheWinner(self, nums: List[int]) -> bool:
+ def predictTheWinner(self, nums: List[int]) -> bool:
@cache
def dfs(i: int, j: int) -> int:
if i > j:
diff --git a/solution/0400-0499/0486.Predict the Winner/Solution.rs b/solution/0400-0499/0486.Predict the Winner/Solution.rs
index b6ad1ea47965a..5757d0ae3acb5 100644
--- a/solution/0400-0499/0486.Predict the Winner/Solution.rs
+++ b/solution/0400-0499/0486.Predict the Winner/Solution.rs
@@ -1,26 +1,21 @@
impl Solution {
- #[allow(dead_code)]
pub fn predict_the_winner(nums: Vec) -> bool {
let n = nums.len();
- let mut dp: Vec> = vec![vec![0; n]; n];
+ let mut f = vec![vec![0; n]; n];
+ Self::dfs(&nums, &mut f, 0, n - 1) >= 0
+ }
- // Initialize the dp vector
- for i in 0..n {
- dp[i][i] = nums[i];
+ fn dfs(nums: &Vec, f: &mut Vec>, i: usize, j: usize) -> i32 {
+ if i == j {
+ return nums[i] as i32;
}
-
- // Begin the dp process
- for i in (0..n - 1).rev() {
- for j in i + 1..n {
- dp[i][j] = std::cmp::max(
- // Take i-th num
- nums[i] - dp[i + 1][j],
- // Take j-th num
- nums[j] - dp[i][j - 1],
- );
- }
+ if f[i][j] != 0 {
+ return f[i][j];
}
-
- dp[0][n - 1] >= 0
+ f[i][j] = std::cmp::max(
+ nums[i] - Self::dfs(nums, f, i + 1, j),
+ nums[j] - Self::dfs(nums, f, i, j - 1),
+ );
+ f[i][j]
}
}
diff --git a/solution/0400-0499/0486.Predict the Winner/Solution.ts b/solution/0400-0499/0486.Predict the Winner/Solution.ts
index 1cb89afa05346..585a42b7f0034 100644
--- a/solution/0400-0499/0486.Predict the Winner/Solution.ts
+++ b/solution/0400-0499/0486.Predict the Winner/Solution.ts
@@ -1,6 +1,6 @@
-function PredictTheWinner(nums: number[]): boolean {
+function predictTheWinner(nums: number[]): boolean {
const n = nums.length;
- const f: number[][] = new Array(n).fill(0).map(() => new Array(n).fill(0));
+ const f: number[][] = Array.from({ length: n }, () => Array(n).fill(0));
const dfs = (i: number, j: number): number => {
if (i > j) {
return 0;
diff --git a/solution/0400-0499/0486.Predict the Winner/Solution2.cpp b/solution/0400-0499/0486.Predict the Winner/Solution2.cpp
index 0d919bbf17695..86664de5ca6da 100644
--- a/solution/0400-0499/0486.Predict the Winner/Solution2.cpp
+++ b/solution/0400-0499/0486.Predict the Winner/Solution2.cpp
@@ -1,6 +1,6 @@
class Solution {
public:
- bool PredictTheWinner(vector& nums) {
+ bool predictTheWinner(vector& nums) {
int n = nums.size();
int f[n][n];
memset(f, 0, sizeof(f));
diff --git a/solution/0400-0499/0486.Predict the Winner/Solution2.go b/solution/0400-0499/0486.Predict the Winner/Solution2.go
index 8becdf3e650b3..384c300459ceb 100644
--- a/solution/0400-0499/0486.Predict the Winner/Solution2.go
+++ b/solution/0400-0499/0486.Predict the Winner/Solution2.go
@@ -1,4 +1,4 @@
-func PredictTheWinner(nums []int) bool {
+func predictTheWinner(nums []int) bool {
n := len(nums)
f := make([][]int, n)
for i, x := range nums {
diff --git a/solution/0400-0499/0486.Predict the Winner/Solution2.java b/solution/0400-0499/0486.Predict the Winner/Solution2.java
index 8ba95d347bf20..e664f055fcb3c 100644
--- a/solution/0400-0499/0486.Predict the Winner/Solution2.java
+++ b/solution/0400-0499/0486.Predict the Winner/Solution2.java
@@ -1,5 +1,5 @@
class Solution {
- public boolean PredictTheWinner(int[] nums) {
+ public boolean predictTheWinner(int[] nums) {
int n = nums.length;
int[][] f = new int[n][n];
for (int i = 0; i < n; ++i) {
diff --git a/solution/0400-0499/0486.Predict the Winner/Solution2.py b/solution/0400-0499/0486.Predict the Winner/Solution2.py
index ea29b78c717a7..7e1f345c281da 100644
--- a/solution/0400-0499/0486.Predict the Winner/Solution2.py
+++ b/solution/0400-0499/0486.Predict the Winner/Solution2.py
@@ -1,5 +1,5 @@
class Solution:
- def PredictTheWinner(self, nums: List[int]) -> bool:
+ def predictTheWinner(self, nums: List[int]) -> bool:
n = len(nums)
f = [[0] * n for _ in range(n)]
for i, x in enumerate(nums):
diff --git a/solution/0400-0499/0486.Predict the Winner/Solution2.rs b/solution/0400-0499/0486.Predict the Winner/Solution2.rs
new file mode 100644
index 0000000000000..5da7136ca4661
--- /dev/null
+++ b/solution/0400-0499/0486.Predict the Winner/Solution2.rs
@@ -0,0 +1,18 @@
+impl Solution {
+ pub fn predict_the_winner(nums: Vec) -> bool {
+ let n = nums.len();
+ let mut f = vec![vec![0; n]; n];
+
+ for i in 0..n {
+ f[i][i] = nums[i];
+ }
+
+ for i in (0..n - 1).rev() {
+ for j in i + 1..n {
+ f[i][j] = std::cmp::max(nums[i] - f[i + 1][j], nums[j] - f[i][j - 1]);
+ }
+ }
+
+ f[0][n - 1] >= 0
+ }
+}
diff --git a/solution/0400-0499/0486.Predict the Winner/Solution2.ts b/solution/0400-0499/0486.Predict the Winner/Solution2.ts
index b276dadc5cb88..ec8f5d5908551 100644
--- a/solution/0400-0499/0486.Predict the Winner/Solution2.ts
+++ b/solution/0400-0499/0486.Predict the Winner/Solution2.ts
@@ -1,6 +1,6 @@
-function PredictTheWinner(nums: number[]): boolean {
+function predictTheWinner(nums: number[]): boolean {
const n = nums.length;
- const f: number[][] = new Array(n).fill(0).map(() => new Array(n).fill(0));
+ const f: number[][] = Array.from({ length: n }, () => Array(n).fill(0));
for (let i = 0; i < n; ++i) {
f[i][i] = nums[i];
}
diff --git a/solution/0500-0599/0525.Contiguous Array/README.md b/solution/0500-0599/0525.Contiguous Array/README.md
index 0e49c1a1f4c82..9b170bc8e884f 100644
--- a/solution/0500-0599/0525.Contiguous Array/README.md
+++ b/solution/0500-0599/0525.Contiguous Array/README.md
@@ -20,28 +20,35 @@ tags:
diff --git a/solution/0500-0599/0525.Contiguous Array/README_EN.md b/solution/0500-0599/0525.Contiguous Array/README_EN.md
index 8dfeb6693c9ae..1377e34ef50fa 100644
--- a/solution/0500-0599/0525.Contiguous Array/README_EN.md
+++ b/solution/0500-0599/0525.Contiguous Array/README_EN.md
@@ -37,6 +37,14 @@ tags:
Explanation: [0, 1] (or [1, 0]) is a longest contiguous subarray with equal number of 0 and 1.
+
Example 3:
+
+
+Input: nums = [0,1,1,1,1,1,0,0,0]
+Output: 6
+Explanation: [1,1,1,0,0,0] is the longest contiguous subarray with equal number of 0 and 1.
+
+
Constraints:
diff --git a/solution/0500-0599/0532.K-diff Pairs in an Array/README.md b/solution/0500-0599/0532.K-diff Pairs in an Array/README.md
index 6ec116976d429..1053a06cc32ac 100644
--- a/solution/0500-0599/0532.K-diff Pairs in an Array/README.md
+++ b/solution/0500-0599/0532.K-diff Pairs in an Array/README.md
@@ -77,11 +77,13 @@ tags:
### 方法一:哈希表
-由于 $k$ 是一个定值,因此用哈希表 $ans$ 记录数对的较小值,就能够确定较大的值。最后返回 ans 的大小作为答案。
+由于 $k$ 是一个定值,我们可以用一个哈希表 $\textit{ans}$ 记录数对的较小值,就能够确定较大的值。最后返回 $\textit{ans}$ 的大小作为答案。
-遍历数组 $nums$,当前遍历到的数 $nums[j]$,我们记为 $v$,用哈希表 $vis$ 记录此前遍历到的所有数字。若 $v-k$ 在 $vis$ 中,则将 $v-k$ 添加至 $ans$;若 $v+k$ 在 $vis$ 中,则将 $v$ 添加至 $ans$。
+遍历数组 $\textit{nums}$,当前遍历到的数 $x$,我们用哈希表 $\textit{vis}$ 记录此前遍历到的所有数字。若 $x-k$ 在 $\textit{vis}$ 中,则将 $x-k$ 添加至 $\textit{ans}$;若 $x+k$ 在 $\textit{vis}$ 中,则将 $x$ 添加至 $\textit{ans}$。然后我们将 $x$ 添加至 $\textit{vis}$。继续遍历数组 $\textit{nums}$ 直至遍历结束。
-时间复杂度 $O(n)$,其中 $n$ 表示数组 $nums$ 的长度。
+最后返回 $\textit{ans}$ 的大小作为答案。
+
+时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为数组 $\textit{nums}$ 的长度。
@@ -90,13 +92,14 @@ tags:
```python
class Solution:
def findPairs(self, nums: List[int], k: int) -> int:
- vis, ans = set(), set()
- for v in nums:
- if v - k in vis:
- ans.add(v - k)
- if v + k in vis:
- ans.add(v)
- vis.add(v)
+ ans = set()
+ vis = set()
+ for x in nums:
+ if x - k in vis:
+ ans.add(x - k)
+ if x + k in vis:
+ ans.add(x)
+ vis.add(x)
return len(ans)
```
@@ -105,16 +108,16 @@ class Solution:
```java
class Solution {
public int findPairs(int[] nums, int k) {
- Set vis = new HashSet<>();
Set ans = new HashSet<>();
- for (int v : nums) {
- if (vis.contains(v - k)) {
- ans.add(v - k);
+ Set vis = new HashSet<>();
+ for (int x : nums) {
+ if (vis.contains(x - k)) {
+ ans.add(x - k);
}
- if (vis.contains(v + k)) {
- ans.add(v);
+ if (vis.contains(x + k)) {
+ ans.add(x);
}
- vis.add(v);
+ vis.add(x);
}
return ans.size();
}
@@ -127,12 +130,15 @@ class Solution {
class Solution {
public:
int findPairs(vector& nums, int k) {
- unordered_set vis;
- unordered_set ans;
- for (int& v : nums) {
- if (vis.count(v - k)) ans.insert(v - k);
- if (vis.count(v + k)) ans.insert(v);
- vis.insert(v);
+ unordered_set ans, vis;
+ for (int x : nums) {
+ if (vis.count(x - k)) {
+ ans.insert(x - k);
+ }
+ if (vis.count(x + k)) {
+ ans.insert(x);
+ }
+ vis.insert(x);
}
return ans.size();
}
@@ -143,52 +149,61 @@ public:
```go
func findPairs(nums []int, k int) int {
- vis := map[int]bool{}
- ans := map[int]bool{}
- for _, v := range nums {
- if vis[v-k] {
- ans[v-k] = true
+ ans := make(map[int]struct{})
+ vis := make(map[int]struct{})
+
+ for _, x := range nums {
+ if _, ok := vis[x-k]; ok {
+ ans[x-k] = struct{}{}
}
- if vis[v+k] {
- ans[v] = true
+ if _, ok := vis[x+k]; ok {
+ ans[x] = struct{}{}
}
- vis[v] = true
+ vis[x] = struct{}{}
}
return len(ans)
}
```
+#### TypeScript
+
+```ts
+function findPairs(nums: number[], k: number): number {
+ const ans = new Set();
+ const vis = new Set();
+ for (const x of nums) {
+ if (vis.has(x - k)) {
+ ans.add(x - k);
+ }
+ if (vis.has(x + k)) {
+ ans.add(x);
+ }
+ vis.add(x);
+ }
+ return ans.size;
+}
+```
+
#### Rust
```rust
+use std::collections::HashSet;
+
impl Solution {
- pub fn find_pairs(mut nums: Vec, k: i32) -> i32 {
- nums.sort();
- let n = nums.len();
- let mut res = 0;
- let mut left = 0;
- let mut right = 1;
- while right < n {
- let num = i32::abs(nums[left] - nums[right]);
- if num == k {
- res += 1;
+ pub fn find_pairs(nums: Vec, k: i32) -> i32 {
+ let mut ans = HashSet::new();
+ let mut vis = HashSet::new();
+
+ for &x in &nums {
+ if vis.contains(&(x - k)) {
+ ans.insert(x - k);
}
- if num <= k {
- right += 1;
- while right < n && nums[right - 1] == nums[right] {
- right += 1;
- }
- } else {
- left += 1;
- while left < right && nums[left - 1] == nums[left] {
- left += 1;
- }
- if left == right {
- right += 1;
- }
+ if vis.contains(&(x + k)) {
+ ans.insert(x);
}
+ vis.insert(x);
}
- res
+ ans.len() as i32
}
}
```
@@ -197,16 +212,4 @@ impl Solution {
-
-
-### 方法二:排序 + 双指针
-
-只需要统计组合的数量,因此可以改动原数组,对其排序,使用双指针来统计。
-
-声明 `left` 与 `right` 指针,初始化为 0 和 1。根据 `abs(nums[left] - nums[right])` 与 `k` 值对比结果移动指针。
-
-需要注意的是,**不能出现重复的组合**,所以移动指针时,不能仅仅是 `+1`,需要到一个不等于当前值的位置。
-
-
-
diff --git a/solution/0500-0599/0532.K-diff Pairs in an Array/README_EN.md b/solution/0500-0599/0532.K-diff Pairs in an Array/README_EN.md
index df31876b15ab2..a7103510c9c72 100644
--- a/solution/0500-0599/0532.K-diff Pairs in an Array/README_EN.md
+++ b/solution/0500-0599/0532.K-diff Pairs in an Array/README_EN.md
@@ -73,7 +73,15 @@ Although we have two 1s in the input, we should only return the number of
-### Solution 1
+### Solution 1: Hash Table
+
+Since $k$ is a fixed value, we can use a hash table $\textit{ans}$ to record the smaller value of the pairs, which allows us to determine the larger value. Finally, we return the size of $\textit{ans}$ as the answer.
+
+We traverse the array $\textit{nums}$. For the current number $x$, we use a hash table $\textit{vis}$ to record all the numbers that have been traversed. If $x-k$ is in $\textit{vis}$, we add $x-k$ to $\textit{ans}$. If $x+k$ is in $\textit{vis}$, we add $x$ to $\textit{ans}$. Then, we add $x$ to $\textit{vis}$. Continue traversing the array $\textit{nums}$ until the end.
+
+Finally, we return the size of $\textit{ans}$ as the answer.
+
+The time complexity is $O(n)$, and the space complexity is $O(n)$. Here, $n$ is the length of the array $\textit{nums}$.
@@ -82,13 +90,14 @@ Although we have two 1s in the input, we should only return the number of int:
- vis, ans = set(), set()
- for v in nums:
- if v - k in vis:
- ans.add(v - k)
- if v + k in vis:
- ans.add(v)
- vis.add(v)
+ ans = set()
+ vis = set()
+ for x in nums:
+ if x - k in vis:
+ ans.add(x - k)
+ if x + k in vis:
+ ans.add(x)
+ vis.add(x)
return len(ans)
```
@@ -97,16 +106,16 @@ class Solution:
```java
class Solution {
public int findPairs(int[] nums, int k) {
- Set vis = new HashSet<>();
Set ans = new HashSet<>();
- for (int v : nums) {
- if (vis.contains(v - k)) {
- ans.add(v - k);
+ Set vis = new HashSet<>();
+ for (int x : nums) {
+ if (vis.contains(x - k)) {
+ ans.add(x - k);
}
- if (vis.contains(v + k)) {
- ans.add(v);
+ if (vis.contains(x + k)) {
+ ans.add(x);
}
- vis.add(v);
+ vis.add(x);
}
return ans.size();
}
@@ -119,12 +128,15 @@ class Solution {
class Solution {
public:
int findPairs(vector& nums, int k) {
- unordered_set vis;
- unordered_set ans;
- for (int& v : nums) {
- if (vis.count(v - k)) ans.insert(v - k);
- if (vis.count(v + k)) ans.insert(v);
- vis.insert(v);
+ unordered_set ans, vis;
+ for (int x : nums) {
+ if (vis.count(x - k)) {
+ ans.insert(x - k);
+ }
+ if (vis.count(x + k)) {
+ ans.insert(x);
+ }
+ vis.insert(x);
}
return ans.size();
}
@@ -135,52 +147,61 @@ public:
```go
func findPairs(nums []int, k int) int {
- vis := map[int]bool{}
- ans := map[int]bool{}
- for _, v := range nums {
- if vis[v-k] {
- ans[v-k] = true
+ ans := make(map[int]struct{})
+ vis := make(map[int]struct{})
+
+ for _, x := range nums {
+ if _, ok := vis[x-k]; ok {
+ ans[x-k] = struct{}{}
}
- if vis[v+k] {
- ans[v] = true
+ if _, ok := vis[x+k]; ok {
+ ans[x] = struct{}{}
}
- vis[v] = true
+ vis[x] = struct{}{}
}
return len(ans)
}
```
+#### TypeScript
+
+```ts
+function findPairs(nums: number[], k: number): number {
+ const ans = new Set();
+ const vis = new Set();
+ for (const x of nums) {
+ if (vis.has(x - k)) {
+ ans.add(x - k);
+ }
+ if (vis.has(x + k)) {
+ ans.add(x);
+ }
+ vis.add(x);
+ }
+ return ans.size;
+}
+```
+
#### Rust
```rust
+use std::collections::HashSet;
+
impl Solution {
- pub fn find_pairs(mut nums: Vec, k: i32) -> i32 {
- nums.sort();
- let n = nums.len();
- let mut res = 0;
- let mut left = 0;
- let mut right = 1;
- while right < n {
- let num = i32::abs(nums[left] - nums[right]);
- if num == k {
- res += 1;
+ pub fn find_pairs(nums: Vec, k: i32) -> i32 {
+ let mut ans = HashSet::new();
+ let mut vis = HashSet::new();
+
+ for &x in &nums {
+ if vis.contains(&(x - k)) {
+ ans.insert(x - k);
}
- if num <= k {
- right += 1;
- while right < n && nums[right - 1] == nums[right] {
- right += 1;
- }
- } else {
- left += 1;
- while left < right && nums[left - 1] == nums[left] {
- left += 1;
- }
- if left == right {
- right += 1;
- }
+ if vis.contains(&(x + k)) {
+ ans.insert(x);
}
+ vis.insert(x);
}
- res
+ ans.len() as i32
}
}
```
diff --git a/solution/0500-0599/0532.K-diff Pairs in an Array/Solution.cpp b/solution/0500-0599/0532.K-diff Pairs in an Array/Solution.cpp
index 63a75d171b756..97132b90ddc92 100644
--- a/solution/0500-0599/0532.K-diff Pairs in an Array/Solution.cpp
+++ b/solution/0500-0599/0532.K-diff Pairs in an Array/Solution.cpp
@@ -1,13 +1,16 @@
class Solution {
public:
int findPairs(vector& nums, int k) {
- unordered_set vis;
- unordered_set ans;
- for (int& v : nums) {
- if (vis.count(v - k)) ans.insert(v - k);
- if (vis.count(v + k)) ans.insert(v);
- vis.insert(v);
+ unordered_set ans, vis;
+ for (int x : nums) {
+ if (vis.count(x - k)) {
+ ans.insert(x - k);
+ }
+ if (vis.count(x + k)) {
+ ans.insert(x);
+ }
+ vis.insert(x);
}
return ans.size();
}
-};
\ No newline at end of file
+};
diff --git a/solution/0500-0599/0532.K-diff Pairs in an Array/Solution.go b/solution/0500-0599/0532.K-diff Pairs in an Array/Solution.go
index d54f2e347e780..065fa1e420e81 100644
--- a/solution/0500-0599/0532.K-diff Pairs in an Array/Solution.go
+++ b/solution/0500-0599/0532.K-diff Pairs in an Array/Solution.go
@@ -1,14 +1,15 @@
func findPairs(nums []int, k int) int {
- vis := map[int]bool{}
- ans := map[int]bool{}
- for _, v := range nums {
- if vis[v-k] {
- ans[v-k] = true
+ ans := make(map[int]struct{})
+ vis := make(map[int]struct{})
+
+ for _, x := range nums {
+ if _, ok := vis[x-k]; ok {
+ ans[x-k] = struct{}{}
}
- if vis[v+k] {
- ans[v] = true
+ if _, ok := vis[x+k]; ok {
+ ans[x] = struct{}{}
}
- vis[v] = true
+ vis[x] = struct{}{}
}
return len(ans)
-}
\ No newline at end of file
+}
diff --git a/solution/0500-0599/0532.K-diff Pairs in an Array/Solution.java b/solution/0500-0599/0532.K-diff Pairs in an Array/Solution.java
index afd1420fa631d..23b97854299c3 100644
--- a/solution/0500-0599/0532.K-diff Pairs in an Array/Solution.java
+++ b/solution/0500-0599/0532.K-diff Pairs in an Array/Solution.java
@@ -1,16 +1,16 @@
class Solution {
public int findPairs(int[] nums, int k) {
- Set vis = new HashSet<>();
Set ans = new HashSet<>();
- for (int v : nums) {
- if (vis.contains(v - k)) {
- ans.add(v - k);
+ Set vis = new HashSet<>();
+ for (int x : nums) {
+ if (vis.contains(x - k)) {
+ ans.add(x - k);
}
- if (vis.contains(v + k)) {
- ans.add(v);
+ if (vis.contains(x + k)) {
+ ans.add(x);
}
- vis.add(v);
+ vis.add(x);
}
return ans.size();
}
-}
\ No newline at end of file
+}
diff --git a/solution/0500-0599/0532.K-diff Pairs in an Array/Solution.py b/solution/0500-0599/0532.K-diff Pairs in an Array/Solution.py
index 8692434342cb1..2f14875c4ed39 100644
--- a/solution/0500-0599/0532.K-diff Pairs in an Array/Solution.py
+++ b/solution/0500-0599/0532.K-diff Pairs in an Array/Solution.py
@@ -1,10 +1,11 @@
class Solution:
def findPairs(self, nums: List[int], k: int) -> int:
- vis, ans = set(), set()
- for v in nums:
- if v - k in vis:
- ans.add(v - k)
- if v + k in vis:
- ans.add(v)
- vis.add(v)
+ ans = set()
+ vis = set()
+ for x in nums:
+ if x - k in vis:
+ ans.add(x - k)
+ if x + k in vis:
+ ans.add(x)
+ vis.add(x)
return len(ans)
diff --git a/solution/0500-0599/0532.K-diff Pairs in an Array/Solution.rs b/solution/0500-0599/0532.K-diff Pairs in an Array/Solution.rs
index 6ee3845d36594..ea6651392f489 100644
--- a/solution/0500-0599/0532.K-diff Pairs in an Array/Solution.rs
+++ b/solution/0500-0599/0532.K-diff Pairs in an Array/Solution.rs
@@ -1,30 +1,19 @@
+use std::collections::HashSet;
+
impl Solution {
- pub fn find_pairs(mut nums: Vec, k: i32) -> i32 {
- nums.sort();
- let n = nums.len();
- let mut res = 0;
- let mut left = 0;
- let mut right = 1;
- while right < n {
- let num = i32::abs(nums[left] - nums[right]);
- if num == k {
- res += 1;
+ pub fn find_pairs(nums: Vec, k: i32) -> i32 {
+ let mut ans = HashSet::new();
+ let mut vis = HashSet::new();
+
+ for &x in &nums {
+ if vis.contains(&(x - k)) {
+ ans.insert(x - k);
}
- if num <= k {
- right += 1;
- while right < n && nums[right - 1] == nums[right] {
- right += 1;
- }
- } else {
- left += 1;
- while left < right && nums[left - 1] == nums[left] {
- left += 1;
- }
- if left == right {
- right += 1;
- }
+ if vis.contains(&(x + k)) {
+ ans.insert(x);
}
+ vis.insert(x);
}
- res
+ ans.len() as i32
}
}
diff --git a/solution/0500-0599/0532.K-diff Pairs in an Array/Solution.ts b/solution/0500-0599/0532.K-diff Pairs in an Array/Solution.ts
new file mode 100644
index 0000000000000..9081b68088cf0
--- /dev/null
+++ b/solution/0500-0599/0532.K-diff Pairs in an Array/Solution.ts
@@ -0,0 +1,14 @@
+function findPairs(nums: number[], k: number): number {
+ const ans = new Set();
+ const vis = new Set();
+ for (const x of nums) {
+ if (vis.has(x - k)) {
+ ans.add(x - k);
+ }
+ if (vis.has(x + k)) {
+ ans.add(x);
+ }
+ vis.add(x);
+ }
+ return ans.size;
+}
diff --git a/solution/0500-0599/0568.Maximum Vacation Days/README.md b/solution/0500-0599/0568.Maximum Vacation Days/README.md
index 0b759e9bf93c8..c482a1c70a038 100644
--- a/solution/0500-0599/0568.Maximum Vacation Days/README.md
+++ b/solution/0500-0599/0568.Maximum Vacation Days/README.md
@@ -98,7 +98,7 @@ Ans = 7 + 7 + 7 = 21
我们定义 $f[k][j]$ 表示前 $k$ 周,且最后一周在城市 $j$ 休假的最长天数。初始时 $f[0][0]=0$,其它 $f[0][j]=-\infty$。答案为 $\max_{j=0}^{n-1} f[K][j]$。
-接下来,我们考虑如何计算 $f[k][j]$。对于当前这一周,我们可以枚举上一周所在的城市 $i$,城市 $i$ 可以和城市 $j$ 相等,那么 $f[k][j] = f[k-1][i]$;也可以和城市 $j$ 不相等,如果不相等,我们需要判断是否可以从城市 $i$ 飞到城市 $j$,如果可以,那么 $f[k][j] = max(f[k][j], f[k-1][i])$。最后,我们还需要加上这一周在城市 $j$ 休假的天数 $days[j][k-1]$。
+接下来,我们考虑如何计算 $f[k][j]$。对于当前这一周,我们可以枚举上一周所在的城市 $i$,城市 $i$ 可以和城市 $j$ 相等,那么 $f[k][j] = f[k-1][i]$;也可以和城市 $j$ 不相等,如果不相等,我们需要判断是否可以从城市 $i$ 飞到城市 $j$,如果可以,那么 $f[k][j] = \max(f[k][j], f[k-1][i])$。最后,我们还需要加上这一周在城市 $j$ 休假的天数 $\textit{days}[j][k-1]$。
最终的答案即为 $\max_{j=0}^{n-1} f[K][j]$。
@@ -220,6 +220,59 @@ func maxVacationDays(flights [][]int, days [][]int) (ans int) {
}
```
+#### TypeScript
+
+```ts
+function maxVacationDays(flights: number[][], days: number[][]): number {
+ const n = flights.length;
+ const K = days[0].length;
+ const inf = Number.NEGATIVE_INFINITY;
+ const f: number[][] = Array.from({ length: K + 1 }, () => Array(n).fill(inf));
+ f[0][0] = 0;
+ for (let k = 1; k <= K; k++) {
+ for (let j = 0; j < n; j++) {
+ f[k][j] = f[k - 1][j];
+ for (let i = 0; i < n; i++) {
+ if (flights[i][j]) {
+ f[k][j] = Math.max(f[k][j], f[k - 1][i]);
+ }
+ }
+ f[k][j] += days[j][k - 1];
+ }
+ }
+ return Math.max(...f[K]);
+}
+```
+
+#### Rust
+
+```rust
+impl Solution {
+ pub fn max_vacation_days(flights: Vec>, days: Vec>) -> i32 {
+ let n = flights.len();
+ let k = days[0].len();
+ let inf = i32::MIN;
+
+ let mut f = vec![vec![inf; n]; k + 1];
+ f[0][0] = 0;
+
+ for step in 1..=k {
+ for j in 0..n {
+ f[step][j] = f[step - 1][j];
+ for i in 0..n {
+ if flights[i][j] == 1 {
+ f[step][j] = f[step][j].max(f[step - 1][i]);
+ }
+ }
+ f[step][j] += days[j][step - 1];
+ }
+ }
+
+ *f[k].iter().max().unwrap()
+ }
+}
+```
+
diff --git a/solution/0500-0599/0568.Maximum Vacation Days/README_EN.md b/solution/0500-0599/0568.Maximum Vacation Days/README_EN.md
index 03606fb98ba45..76fc29b6c73be 100644
--- a/solution/0500-0599/0568.Maximum Vacation Days/README_EN.md
+++ b/solution/0500-0599/0568.Maximum Vacation Days/README_EN.md
@@ -211,6 +211,59 @@ func maxVacationDays(flights [][]int, days [][]int) (ans int) {
}
```
+#### TypeScript
+
+```ts
+function maxVacationDays(flights: number[][], days: number[][]): number {
+ const n = flights.length;
+ const K = days[0].length;
+ const inf = Number.NEGATIVE_INFINITY;
+ const f: number[][] = Array.from({ length: K + 1 }, () => Array(n).fill(inf));
+ f[0][0] = 0;
+ for (let k = 1; k <= K; k++) {
+ for (let j = 0; j < n; j++) {
+ f[k][j] = f[k - 1][j];
+ for (let i = 0; i < n; i++) {
+ if (flights[i][j]) {
+ f[k][j] = Math.max(f[k][j], f[k - 1][i]);
+ }
+ }
+ f[k][j] += days[j][k - 1];
+ }
+ }
+ return Math.max(...f[K]);
+}
+```
+
+#### Rust
+
+```rust
+impl Solution {
+ pub fn max_vacation_days(flights: Vec>, days: Vec>) -> i32 {
+ let n = flights.len();
+ let k = days[0].len();
+ let inf = i32::MIN;
+
+ let mut f = vec![vec![inf; n]; k + 1];
+ f[0][0] = 0;
+
+ for step in 1..=k {
+ for j in 0..n {
+ f[step][j] = f[step - 1][j];
+ for i in 0..n {
+ if flights[i][j] == 1 {
+ f[step][j] = f[step][j].max(f[step - 1][i]);
+ }
+ }
+ f[step][j] += days[j][step - 1];
+ }
+ }
+
+ *f[k].iter().max().unwrap()
+ }
+}
+```
+
diff --git a/solution/0500-0599/0568.Maximum Vacation Days/Solution.rs b/solution/0500-0599/0568.Maximum Vacation Days/Solution.rs
new file mode 100644
index 0000000000000..2483954a7ad16
--- /dev/null
+++ b/solution/0500-0599/0568.Maximum Vacation Days/Solution.rs
@@ -0,0 +1,24 @@
+impl Solution {
+ pub fn max_vacation_days(flights: Vec>, days: Vec>) -> i32 {
+ let n = flights.len();
+ let k = days[0].len();
+ let inf = i32::MIN;
+
+ let mut f = vec![vec![inf; n]; k + 1];
+ f[0][0] = 0;
+
+ for step in 1..=k {
+ for j in 0..n {
+ f[step][j] = f[step - 1][j];
+ for i in 0..n {
+ if flights[i][j] == 1 {
+ f[step][j] = f[step][j].max(f[step - 1][i]);
+ }
+ }
+ f[step][j] += days[j][step - 1];
+ }
+ }
+
+ *f[k].iter().max().unwrap()
+ }
+}
diff --git a/solution/0500-0599/0568.Maximum Vacation Days/Solution.ts b/solution/0500-0599/0568.Maximum Vacation Days/Solution.ts
new file mode 100644
index 0000000000000..23f7d25974af5
--- /dev/null
+++ b/solution/0500-0599/0568.Maximum Vacation Days/Solution.ts
@@ -0,0 +1,19 @@
+function maxVacationDays(flights: number[][], days: number[][]): number {
+ const n = flights.length;
+ const K = days[0].length;
+ const inf = Number.NEGATIVE_INFINITY;
+ const f: number[][] = Array.from({ length: K + 1 }, () => Array(n).fill(inf));
+ f[0][0] = 0;
+ for (let k = 1; k <= K; k++) {
+ for (let j = 0; j < n; j++) {
+ f[k][j] = f[k - 1][j];
+ for (let i = 0; i < n; i++) {
+ if (flights[i][j]) {
+ f[k][j] = Math.max(f[k][j], f[k - 1][i]);
+ }
+ }
+ f[k][j] += days[j][k - 1];
+ }
+ }
+ return Math.max(...f[K]);
+}
diff --git a/solution/0600-0699/0631.Design Excel Sum Formula/README.md b/solution/0600-0699/0631.Design Excel Sum Formula/README.md
index 5559a4feeaeec..fe1c6cd51ca57 100644
--- a/solution/0600-0699/0631.Design Excel Sum Formula/README.md
+++ b/solution/0600-0699/0631.Design Excel Sum Formula/README.md
@@ -7,6 +7,8 @@ tags:
- 设计
- 拓扑排序
- 数组
+ - 哈希表
+ - 字符串
- 矩阵
---
diff --git a/solution/0600-0699/0631.Design Excel Sum Formula/README_EN.md b/solution/0600-0699/0631.Design Excel Sum Formula/README_EN.md
index cd7ce68ca40f6..6c32824892c92 100644
--- a/solution/0600-0699/0631.Design Excel Sum Formula/README_EN.md
+++ b/solution/0600-0699/0631.Design Excel Sum Formula/README_EN.md
@@ -7,6 +7,8 @@ tags:
- Design
- Topological Sort
- Array
+ - Hash Table
+ - String
- Matrix
---
diff --git a/solution/0600-0699/0676.Implement Magic Dictionary/README.md b/solution/0600-0699/0676.Implement Magic Dictionary/README.md
index f7f70ca3b0acc..4ce831461d15b 100644
--- a/solution/0600-0699/0676.Implement Magic Dictionary/README.md
+++ b/solution/0600-0699/0676.Implement Magic Dictionary/README.md
@@ -430,53 +430,59 @@ class MagicDictionary {
#### Rust
```rust
-use std::collections::HashMap;
-
-#[derive(Clone)]
struct Trie {
- children: Vec