Skip to content

Commit 839f063

Browse files
committed
feat: add solutions to lc problem: No.2037
No.2037.Minimum Number of Moves to Seat Everyone
1 parent 7477cb8 commit 839f063

File tree

6 files changed

+41
-34
lines changed

6 files changed

+41
-34
lines changed

solution/0800-0899/0855.Exam Room/README.md

+2-4
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,9 @@ seat() -> 5,学生最后坐在 5 号座位上。
4444

4545
**方法一:有序集合 + 哈希表**
4646

47-
考虑到每次 `seat` 都需要找到最大距离的座位,因此我们可以使用有序集合来维护所有座位之间的距离,距离越大的座位会越先被选中
47+
考虑到每次 $seat()$ 时都需要找到最大距离的座位,我们可以使用有序集合来保存座位区间。有序集合的每个元素为一个二元组 $(l, r)$,表示 $l$ 和 $r$ 之间(不包括 $l$ 和 $r$)的座位可以坐学生。初始时有序集合中只有一个元素 $(-1, n)$,表示 $(-1, n)$ 之间的座位可以坐学生
4848

49-
有序集合的每个元素为一个二元组 $(l, r)$,表示 $l$ 和 $r$ 之间(不包括 $l$ 和 $r$)的座位可以坐人,初始时有序集合中只有一个元素 $(-1, n)$,表示 $(-1, n)$ 之间的座位可以坐人。
50-
51-
另外,我们使用两个哈希表 `left``right` 来维护每个位置左右两侧坐着人的位置,方便我们在 `leave` 时合并两个空闲的座位区间。
49+
另外,我们使用两个哈希表 `left``right` 来维护每个有学生的座位的左右邻居学生,方便我们在 $leave(p)$ 时合并两个座位区间。
5250

5351
时间复杂度 $O(\log n)$,空间复杂度 $O(n)$。其中 $n$ 为考场的座位数。
5452

solution/2000-2099/2037.Minimum Number of Moves to Seat Everyone/README.md

+17-10
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,12 @@
6969

7070
<!-- 这里可写通用的实现逻辑 -->
7171

72+
**方法一:排序**
73+
74+
将两个数组分别排序,然后遍历两个数组,计算每个学生的座位与其实际座位的距离,将所有距离相加即为答案。
75+
76+
时间复杂度 $O(n \times \log n)$,空间复杂度 $O(\log n)$。其中 $n$ 为数组 `seats``students` 的长度。
77+
7278
<!-- tabs:start -->
7379

7480
### **Python3**
@@ -80,7 +86,7 @@ class Solution:
8086
def minMovesToSeat(self, seats: List[int], students: List[int]) -> int:
8187
seats.sort()
8288
students.sort()
83-
return sum(abs(seats[i] - students[i]) for i in range(len(seats)))
89+
return sum(abs(a - b) for a, b in zip(seats, students))
8490
```
8591

8692
### **Java**
@@ -110,8 +116,9 @@ public:
110116
sort(seats.begin(), seats.end());
111117
sort(students.begin(), students.end());
112118
int ans = 0;
113-
for (int i = 0; i < seats.size(); ++i)
119+
for (int i = 0; i < seats.size(); ++i) {
114120
ans += abs(seats[i] - students[i]);
121+
}
115122
return ans;
116123
}
117124
};
@@ -120,21 +127,21 @@ public:
120127
### **Go**
121128
122129
```go
123-
func minMovesToSeat(seats []int, students []int) int {
130+
func minMovesToSeat(seats []int, students []int) (ans int) {
124131
sort.Ints(seats)
125132
sort.Ints(students)
126-
ans := 0
127-
for i := range students {
128-
ans += abs(seats[i] - students[i])
133+
for i, a := range seats {
134+
b := students[i]
135+
ans += abs(a - b)
129136
}
130-
return ans
137+
return
131138
}
132139
133140
func abs(x int) int {
134-
if x >= 0 {
135-
return x
141+
if x < 0 {
142+
return -x
136143
}
137-
return -x
144+
return x
138145
}
139146
```
140147

solution/2000-2099/2037.Minimum Number of Moves to Seat Everyone/README_EN.md

+11-10
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ class Solution:
7676
def minMovesToSeat(self, seats: List[int], students: List[int]) -> int:
7777
seats.sort()
7878
students.sort()
79-
return sum(abs(seats[i] - students[i]) for i in range(len(seats)))
79+
return sum(abs(a - b) for a, b in zip(seats, students))
8080
```
8181

8282
### **Java**
@@ -104,8 +104,9 @@ public:
104104
sort(seats.begin(), seats.end());
105105
sort(students.begin(), students.end());
106106
int ans = 0;
107-
for (int i = 0; i < seats.size(); ++i)
107+
for (int i = 0; i < seats.size(); ++i) {
108108
ans += abs(seats[i] - students[i]);
109+
}
109110
return ans;
110111
}
111112
};
@@ -114,21 +115,21 @@ public:
114115
### **Go**
115116
116117
```go
117-
func minMovesToSeat(seats []int, students []int) int {
118+
func minMovesToSeat(seats []int, students []int) (ans int) {
118119
sort.Ints(seats)
119120
sort.Ints(students)
120-
ans := 0
121-
for i := range students {
122-
ans += abs(seats[i] - students[i])
121+
for i, a := range seats {
122+
b := students[i]
123+
ans += abs(a - b)
123124
}
124-
return ans
125+
return
125126
}
126127
127128
func abs(x int) int {
128-
if x >= 0 {
129-
return x
129+
if x < 0 {
130+
return -x
130131
}
131-
return -x
132+
return x
132133
}
133134
```
134135

solution/2000-2099/2037.Minimum Number of Moves to Seat Everyone/Solution.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@ class Solution {
44
sort(seats.begin(), seats.end());
55
sort(students.begin(), students.end());
66
int ans = 0;
7-
for (int i = 0; i < seats.size(); ++i)
7+
for (int i = 0; i < seats.size(); ++i) {
88
ans += abs(seats[i] - students[i]);
9+
}
910
return ans;
1011
}
1112
};
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
1-
func minMovesToSeat(seats []int, students []int) int {
1+
func minMovesToSeat(seats []int, students []int) (ans int) {
22
sort.Ints(seats)
33
sort.Ints(students)
4-
ans := 0
5-
for i := range students {
6-
ans += abs(seats[i] - students[i])
4+
for i, a := range seats {
5+
b := students[i]
6+
ans += abs(a - b)
77
}
8-
return ans
8+
return
99
}
1010

1111
func abs(x int) int {
12-
if x >= 0 {
13-
return x
12+
if x < 0 {
13+
return -x
1414
}
15-
return -x
15+
return x
1616
}

solution/2000-2099/2037.Minimum Number of Moves to Seat Everyone/Solution.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@ class Solution:
22
def minMovesToSeat(self, seats: List[int], students: List[int]) -> int:
33
seats.sort()
44
students.sort()
5-
return sum(abs(seats[i] - students[i]) for i in range(len(seats)))
5+
return sum(abs(a - b) for a, b in zip(seats, students))

0 commit comments

Comments
 (0)