diff --git a/solution/1700-1799/1760.Minimum Limit of Balls in a Bag/README_EN.md b/solution/1700-1799/1760.Minimum Limit of Balls in a Bag/README_EN.md
index 4a2d5253401f5..45a3a7056bebe 100644
--- a/solution/1700-1799/1760.Minimum Limit of Balls in a Bag/README_EN.md
+++ b/solution/1700-1799/1760.Minimum Limit of Balls in a Bag/README_EN.md
@@ -43,7 +43,7 @@ tags:
Input: nums = [9], maxOperations = 2
Output: 3
-Explanation:
+Explanation:
- Divide the bag with 9 balls into two bags of sizes 6 and 3. [9] -> [6,3].
- Divide the bag with 6 balls into two bags of sizes 3 and 3. [6,3] -> [3,3,3].
The bag with the most number of balls has 3 balls, so your penalty is 3 and you should return 3.
diff --git a/solution/1800-1899/1887.Reduction Operations to Make the Array Elements Equal/README.md b/solution/1800-1899/1887.Reduction Operations to Make the Array Elements Equal/README.md
index 9e93c2f20ead7..5d5fe49767ebd 100644
--- a/solution/1800-1899/1887.Reduction Operations to Make the Array Elements Equal/README.md
+++ b/solution/1800-1899/1887.Reduction Operations to Make the Array Elements Equal/README.md
@@ -57,8 +57,8 @@ tags:
输出:4
解释:需要 4 次操作使 nums 中的所有元素相等:
1. largest = 3 下标为 4 。nextLargest = 2 。将 nums[4] 减少到 2 。nums = [1,1,2,2,2] 。
-2. largest = 2 下标为 2 。nextLargest = 1 。将 nums[2] 减少到 1 。nums = [1,1,1,2,2] 。
-3. largest = 2 下标为 3 。nextLargest = 1 。将 nums[3] 减少到 1 。nums = [1,1,1,1,2] 。
+2. largest = 2 下标为 2 。nextLargest = 1 。将 nums[2] 减少到 1 。nums = [1,1,1,2,2] 。
+3. largest = 2 下标为 3 。nextLargest = 1 。将 nums[3] 减少到 1 。nums = [1,1,1,1,2] 。
4. largest = 2 下标为 4 。nextLargest = 1 。将 nums[4] 减少到 1 。nums = [1,1,1,1,1] 。
diff --git a/solution/3400-3499/3450.Maximum Students on a Single Bench/README.md b/solution/3400-3499/3450.Maximum Students on a Single Bench/README.md
new file mode 100644
index 0000000000000..f77c8fcf2ce5d
--- /dev/null
+++ b/solution/3400-3499/3450.Maximum Students on a Single Bench/README.md
@@ -0,0 +1,232 @@
+---
+comments: true
+difficulty: 简单
+edit_url: https://github.com/doocs/leetcode/edit/main/solution/3400-3499/3450.Maximum%20Students%20on%20a%20Single%20Bench/README.md
+---
+
+
+
+# [3450. 一张长椅的上最多学生 🔒](https://leetcode.cn/problems/maximum-students-on-a-single-bench)
+
+[English Version](/solution/3400-3499/3450.Maximum%20Students%20on%20a%20Single%20Bench/README_EN.md)
+
+## 题目描述
+
+
+
+给定一个包含学生数据的 2 维数组 students
,其中 students[i] = [student_id, bench_id]
表示学生 student_id
正坐在长椅 bench_id
上。
+
+返回单个长凳上坐着的不同学生的 最大 数量。如果没有学生,返回 0。
+
+注意:一个学生在输入中可以出现在同一张长椅上多次,但每个长椅上只能计算一次。
+
+
+
+示例 1:
+
+
+
输入:students = [[1,2],[2,2],[3,3],[1,3],[2,3]]
+
+
输出:3
+
+
解释:
+
+
+ - 长椅 2 上有 2 个不同学生:
[1, 2]
。
+ - 长椅 3 上有 3 个不同学生:
[1, 2, 3]
。
+ - 一张长椅上不同学生的最大数量是 3。
+
+
+
+示例 2:
+
+
+
输入:students = [[1,1],[2,1],[3,1],[4,2],[5,2]]
+
+
输出:3
+
+
示例:
+
+
+ - 长椅 1 上有 3 个不同学生:
[1, 2, 3]
。
+ - 长椅 2 上有 2 个不同学生:
[4, 5]
。
+ - 一张长椅上不同学生的最大数量是 3。
+
+
+
+示例 3:
+
+
+
输入:students = [[1,1],[1,1]]
+
+
输出:1
+
+
解释:
+
+
+
+
+示例 4:
+
+
+
输入:students = []
+
+
输出:0
+
+
解释:
+
+
+
+
+
+
+提示:
+
+
+ 0 <= students.length <= 100
+ students[i] = [student_id, bench_id]
+ 1 <= student_id <= 100
+ 1 <= bench_id <= 100
+
+
+
+
+## 解法
+
+
+
+### 方法一:哈希表
+
+我们用一个哈希表 $d$ 来存储每个长椅上的学生,键为长椅编号,值为一个集合,集合中存储着该长椅上的学生编号。
+
+遍历学生数组 $\textit{students}$,将学生编号和长椅编号存入哈希表 $d$ 中。
+
+最后,我们遍历哈希表 $d$ 的值,取出集合的大小的最大值即为一张长椅上坐着的不同学生的最大数量。
+
+时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为学生数组 $\textit{students}$ 的长度。
+
+
+
+#### Python3
+
+```python
+class Solution:
+ def maxStudentsOnBench(self, students: List[List[int]]) -> int:
+ if not students:
+ return 0
+ d = defaultdict(set)
+ for student_id, bench_id in students:
+ d[bench_id].add(student_id)
+ return max(map(len, d.values()))
+```
+
+#### Java
+
+```java
+class Solution {
+ public int maxStudentsOnBench(int[][] students) {
+ Map> d = new HashMap<>();
+ for (var e : students) {
+ int studentId = e[0], benchId = e[1];
+ d.computeIfAbsent(benchId, k -> new HashSet<>()).add(studentId);
+ }
+ int ans = 0;
+ for (var s : d.values()) {
+ ans = Math.max(ans, s.size());
+ }
+ return ans;
+ }
+}
+```
+
+#### C++
+
+```cpp
+class Solution {
+public:
+ int maxStudentsOnBench(vector>& students) {
+ unordered_map> d;
+ for (const auto& e : students) {
+ int studentId = e[0], benchId = e[1];
+ d[benchId].insert(studentId);
+ }
+ int ans = 0;
+ for (const auto& s : d) {
+ ans = max(ans, (int) s.second.size());
+ }
+ return ans;
+ }
+};
+```
+
+#### Go
+
+```go
+func maxStudentsOnBench(students [][]int) (ans int) {
+ d := make(map[int]map[int]struct{})
+ for _, e := range students {
+ studentId, benchId := e[0], e[1]
+ if _, exists := d[benchId]; !exists {
+ d[benchId] = make(map[int]struct{})
+ }
+ d[benchId][studentId] = struct{}{}
+ }
+ for _, s := range d {
+ ans = max(ans, len(s))
+ }
+ return
+}
+```
+
+#### TypeScript
+
+```ts
+function maxStudentsOnBench(students: number[][]): number {
+ const d: Map> = new Map();
+ for (const [studentId, benchId] of students) {
+ if (!d.has(benchId)) {
+ d.set(benchId, new Set());
+ }
+ d.get(benchId)?.add(studentId);
+ }
+ let ans = 0;
+ for (const s of d.values()) {
+ ans = Math.max(ans, s.size);
+ }
+ return ans;
+}
+```
+
+#### Rust
+
+```rust
+use std::collections::{HashMap, HashSet};
+
+impl Solution {
+ pub fn max_students_on_bench(students: Vec>) -> i32 {
+ let mut d: HashMap> = HashMap::new();
+ for e in students {
+ let student_id = e[0];
+ let bench_id = e[1];
+ d.entry(bench_id)
+ .or_insert_with(HashSet::new)
+ .insert(student_id);
+ }
+ let mut ans = 0;
+ for s in d.values() {
+ ans = ans.max(s.len() as i32);
+ }
+ ans
+ }
+}
+```
+
+
+
+
+
+
diff --git a/solution/3400-3499/3450.Maximum Students on a Single Bench/README_EN.md b/solution/3400-3499/3450.Maximum Students on a Single Bench/README_EN.md
new file mode 100644
index 0000000000000..d615781f413ee
--- /dev/null
+++ b/solution/3400-3499/3450.Maximum Students on a Single Bench/README_EN.md
@@ -0,0 +1,230 @@
+---
+comments: true
+difficulty: Easy
+edit_url: https://github.com/doocs/leetcode/edit/main/solution/3400-3499/3450.Maximum%20Students%20on%20a%20Single%20Bench/README_EN.md
+---
+
+
+
+# [3450. Maximum Students on a Single Bench 🔒](https://leetcode.com/problems/maximum-students-on-a-single-bench)
+
+[中文文档](/solution/3400-3499/3450.Maximum%20Students%20on%20a%20Single%20Bench/README.md)
+
+## Description
+
+
+
+You are given a 2D integer array of student data students
, where students[i] = [student_id, bench_id]
represents that student student_id
is sitting on the bench bench_id
.
+
+Return the maximum number of unique students sitting on any single bench. If no students are present, return 0.
+
+Note: A student can appear multiple times on the same bench in the input, but they should be counted only once per bench.
+
+
+Example 1:
+
+
+
Input: students = [[1,2],[2,2],[3,3],[1,3],[2,3]]
+
+
Output: 3
+
+
Explanation:
+
+
+ - Bench 2 has two unique students:
[1, 2]
.
+ - Bench 3 has three unique students:
[1, 2, 3]
.
+ - The maximum number of unique students on a single bench is 3.
+
+
+
+Example 2:
+
+
+
Input: students = [[1,1],[2,1],[3,1],[4,2],[5,2]]
+
+
Output: 3
+
+
Explanation:
+
+
+ - Bench 1 has three unique students:
[1, 2, 3]
.
+ - Bench 2 has two unique students:
[4, 5]
.
+ - The maximum number of unique students on a single bench is 3.
+
+
+
+Example 3:
+
+
+
Input: students = [[1,1],[1,1]]
+
+
Output: 1
+
+
Explanation:
+
+
+ - The maximum number of unique students on a single bench is 1.
+
+
+
+Example 4:
+
+
+
Input: students = []
+
+
Output: 0
+
+
Explanation:
+
+
+ - Since no students are present, the output is 0.
+
+
+
+
+Constraints:
+
+
+ 0 <= students.length <= 100
+ students[i] = [student_id, bench_id]
+ 1 <= student_id <= 100
+ 1 <= bench_id <= 100
+
+
+
+
+## Solutions
+
+
+
+### Solution 1: Hash Table
+
+We use a hash table $d$ to store the students on each bench, where the key is the bench number and the value is a set containing the student IDs on that bench.
+
+Traverse the student array $\textit{students}$ and store the student IDs and bench numbers in the hash table $d$.
+
+Finally, we traverse the values of the hash table $d$ and take the maximum size of the sets, which is the maximum number of different students on a single bench.
+
+The time complexity is $O(n)$, and the space complexity is $O(n)$. Here, $n$ is the length of the student array $\textit{students}$.
+
+
+
+#### Python3
+
+```python
+class Solution:
+ def maxStudentsOnBench(self, students: List[List[int]]) -> int:
+ if not students:
+ return 0
+ d = defaultdict(set)
+ for student_id, bench_id in students:
+ d[bench_id].add(student_id)
+ return max(map(len, d.values()))
+```
+
+#### Java
+
+```java
+class Solution {
+ public int maxStudentsOnBench(int[][] students) {
+ Map> d = new HashMap<>();
+ for (var e : students) {
+ int studentId = e[0], benchId = e[1];
+ d.computeIfAbsent(benchId, k -> new HashSet<>()).add(studentId);
+ }
+ int ans = 0;
+ for (var s : d.values()) {
+ ans = Math.max(ans, s.size());
+ }
+ return ans;
+ }
+}
+```
+
+#### C++
+
+```cpp
+class Solution {
+public:
+ int maxStudentsOnBench(vector>& students) {
+ unordered_map> d;
+ for (const auto& e : students) {
+ int studentId = e[0], benchId = e[1];
+ d[benchId].insert(studentId);
+ }
+ int ans = 0;
+ for (const auto& s : d) {
+ ans = max(ans, (int) s.second.size());
+ }
+ return ans;
+ }
+};
+```
+
+#### Go
+
+```go
+func maxStudentsOnBench(students [][]int) (ans int) {
+ d := make(map[int]map[int]struct{})
+ for _, e := range students {
+ studentId, benchId := e[0], e[1]
+ if _, exists := d[benchId]; !exists {
+ d[benchId] = make(map[int]struct{})
+ }
+ d[benchId][studentId] = struct{}{}
+ }
+ for _, s := range d {
+ ans = max(ans, len(s))
+ }
+ return
+}
+```
+
+#### TypeScript
+
+```ts
+function maxStudentsOnBench(students: number[][]): number {
+ const d: Map> = new Map();
+ for (const [studentId, benchId] of students) {
+ if (!d.has(benchId)) {
+ d.set(benchId, new Set());
+ }
+ d.get(benchId)?.add(studentId);
+ }
+ let ans = 0;
+ for (const s of d.values()) {
+ ans = Math.max(ans, s.size);
+ }
+ return ans;
+}
+```
+
+#### Rust
+
+```rust
+use std::collections::{HashMap, HashSet};
+
+impl Solution {
+ pub fn max_students_on_bench(students: Vec>) -> i32 {
+ let mut d: HashMap> = HashMap::new();
+ for e in students {
+ let student_id = e[0];
+ let bench_id = e[1];
+ d.entry(bench_id)
+ .or_insert_with(HashSet::new)
+ .insert(student_id);
+ }
+ let mut ans = 0;
+ for s in d.values() {
+ ans = ans.max(s.len() as i32);
+ }
+ ans
+ }
+}
+```
+
+
+
+
+
+
diff --git a/solution/3400-3499/3450.Maximum Students on a Single Bench/Solution.cpp b/solution/3400-3499/3450.Maximum Students on a Single Bench/Solution.cpp
new file mode 100644
index 0000000000000..d26e9eef798e9
--- /dev/null
+++ b/solution/3400-3499/3450.Maximum Students on a Single Bench/Solution.cpp
@@ -0,0 +1,15 @@
+class Solution {
+public:
+ int maxStudentsOnBench(vector>& students) {
+ unordered_map> d;
+ for (const auto& e : students) {
+ int studentId = e[0], benchId = e[1];
+ d[benchId].insert(studentId);
+ }
+ int ans = 0;
+ for (const auto& s : d) {
+ ans = max(ans, (int) s.second.size());
+ }
+ return ans;
+ }
+};
diff --git a/solution/3400-3499/3450.Maximum Students on a Single Bench/Solution.go b/solution/3400-3499/3450.Maximum Students on a Single Bench/Solution.go
new file mode 100644
index 0000000000000..65c8c8c6e24d7
--- /dev/null
+++ b/solution/3400-3499/3450.Maximum Students on a Single Bench/Solution.go
@@ -0,0 +1,14 @@
+func maxStudentsOnBench(students [][]int) (ans int) {
+ d := make(map[int]map[int]struct{})
+ for _, e := range students {
+ studentId, benchId := e[0], e[1]
+ if _, exists := d[benchId]; !exists {
+ d[benchId] = make(map[int]struct{})
+ }
+ d[benchId][studentId] = struct{}{}
+ }
+ for _, s := range d {
+ ans = max(ans, len(s))
+ }
+ return
+}
diff --git a/solution/3400-3499/3450.Maximum Students on a Single Bench/Solution.java b/solution/3400-3499/3450.Maximum Students on a Single Bench/Solution.java
new file mode 100644
index 0000000000000..2f6f4f036df08
--- /dev/null
+++ b/solution/3400-3499/3450.Maximum Students on a Single Bench/Solution.java
@@ -0,0 +1,14 @@
+class Solution {
+ public int maxStudentsOnBench(int[][] students) {
+ Map> d = new HashMap<>();
+ for (var e : students) {
+ int studentId = e[0], benchId = e[1];
+ d.computeIfAbsent(benchId, k -> new HashSet<>()).add(studentId);
+ }
+ int ans = 0;
+ for (var s : d.values()) {
+ ans = Math.max(ans, s.size());
+ }
+ return ans;
+ }
+}
diff --git a/solution/3400-3499/3450.Maximum Students on a Single Bench/Solution.py b/solution/3400-3499/3450.Maximum Students on a Single Bench/Solution.py
new file mode 100644
index 0000000000000..2c577c2dd3cb7
--- /dev/null
+++ b/solution/3400-3499/3450.Maximum Students on a Single Bench/Solution.py
@@ -0,0 +1,8 @@
+class Solution:
+ def maxStudentsOnBench(self, students: List[List[int]]) -> int:
+ if not students:
+ return 0
+ d = defaultdict(set)
+ for student_id, bench_id in students:
+ d[bench_id].add(student_id)
+ return max(map(len, d.values()))
diff --git a/solution/3400-3499/3450.Maximum Students on a Single Bench/Solution.rs b/solution/3400-3499/3450.Maximum Students on a Single Bench/Solution.rs
new file mode 100644
index 0000000000000..4cd8cbc9c3697
--- /dev/null
+++ b/solution/3400-3499/3450.Maximum Students on a Single Bench/Solution.rs
@@ -0,0 +1,19 @@
+use std::collections::{HashMap, HashSet};
+
+impl Solution {
+ pub fn max_students_on_bench(students: Vec>) -> i32 {
+ let mut d: HashMap> = HashMap::new();
+ for e in students {
+ let student_id = e[0];
+ let bench_id = e[1];
+ d.entry(bench_id)
+ .or_insert_with(HashSet::new)
+ .insert(student_id);
+ }
+ let mut ans = 0;
+ for s in d.values() {
+ ans = ans.max(s.len() as i32);
+ }
+ ans
+ }
+}
diff --git a/solution/3400-3499/3450.Maximum Students on a Single Bench/Solution.ts b/solution/3400-3499/3450.Maximum Students on a Single Bench/Solution.ts
new file mode 100644
index 0000000000000..c6035afee0cd0
--- /dev/null
+++ b/solution/3400-3499/3450.Maximum Students on a Single Bench/Solution.ts
@@ -0,0 +1,14 @@
+function maxStudentsOnBench(students: number[][]): number {
+ const d: Map> = new Map();
+ for (const [studentId, benchId] of students) {
+ if (!d.has(benchId)) {
+ d.set(benchId, new Set());
+ }
+ d.get(benchId)?.add(studentId);
+ }
+ let ans = 0;
+ for (const s of d.values()) {
+ ans = Math.max(ans, s.size);
+ }
+ return ans;
+}
diff --git a/solution/README.md b/solution/README.md
index a8e8e082efd51..e72fac6f5073b 100644
--- a/solution/README.md
+++ b/solution/README.md
@@ -3460,6 +3460,7 @@
| 3447 | [将元素分配给有约束条件的组](/solution/3400-3499/3447.Assign%20Elements%20to%20Groups%20with%20Constraints/README.md) | | 中等 | 第 436 场周赛 |
| 3448 | [统计可以被最后一个数位整除的子字符串数目](/solution/3400-3499/3448.Count%20Substrings%20Divisible%20By%20Last%20Digit/README.md) | | 困难 | 第 436 场周赛 |
| 3449 | [最大化游戏分数的最小值](/solution/3400-3499/3449.Maximize%20the%20Minimum%20Game%20Score/README.md) | | 困难 | 第 436 场周赛 |
+| 3450 | [一张长椅的上最多学生](/solution/3400-3499/3450.Maximum%20Students%20on%20a%20Single%20Bench/README.md) | | 简单 | 🔒 |
## 版权
diff --git a/solution/README_EN.md b/solution/README_EN.md
index c78935faefcd8..d9f44db234e4a 100644
--- a/solution/README_EN.md
+++ b/solution/README_EN.md
@@ -3458,6 +3458,7 @@ Press Control + F(or Command + F on
| 3447 | [Assign Elements to Groups with Constraints](/solution/3400-3499/3447.Assign%20Elements%20to%20Groups%20with%20Constraints/README_EN.md) | | Medium | Weekly Contest 436 |
| 3448 | [Count Substrings Divisible By Last Digit](/solution/3400-3499/3448.Count%20Substrings%20Divisible%20By%20Last%20Digit/README_EN.md) | | Hard | Weekly Contest 436 |
| 3449 | [Maximize the Minimum Game Score](/solution/3400-3499/3449.Maximize%20the%20Minimum%20Game%20Score/README_EN.md) | | Hard | Weekly Contest 436 |
+| 3450 | [Maximum Students on a Single Bench](/solution/3400-3499/3450.Maximum%20Students%20on%20a%20Single%20Bench/README_EN.md) | | Easy | 🔒 |
## Copyright