算法2037. 使每位学生都有座位的最少移动次数(java / c / c++ / python / go / rust)
Posted 二当家的白帽子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法2037. 使每位学生都有座位的最少移动次数(java / c / c++ / python / go / rust)相关的知识,希望对你有一定的参考价值。
文章目录
2037. 使每位学生都有座位的最少移动次数:
一个房间里有 n
个座位和 n
名学生,房间用一个数轴表示。给你一个长度为 n
的数组 seats
,其中 seats[i]
是第 i
个座位的位置。同时给你一个长度为 n
的数组 students
,其中 students[j]
是第 j
位学生的位置。
你可以执行以下操作任意次:
- 增加或者减少第
i
位学生的位置,每次变化量为1
(也就是将第i
位学生从位置x
移动到x + 1
或者x - 1
)
请你返回使所有学生都有座位坐的 最少移动次数 ,并确保没有两位学生的座位相同。
请注意,初始时有可能有多个座位或者多位学生在 同一 位置。
样例 1:
输入:
seats = [3,1,5], students = [2,7,4]
输出:
4
解释:
学生移动方式如下:
- 第一位学生从位置 2 移动到位置 1 ,移动 1 次。
- 第二位学生从位置 7 移动到位置 5 ,移动 2 次。
- 第三位学生从位置 4 移动到位置 3 ,移动 1 次。
总共 1 + 2 + 1 = 4 次移动。
样例 2:
输入:
seats = [4,1,5,9], students = [1,3,2,6]
输出:
7
解释:
学生移动方式如下:
- 第一位学生不移动。
- 第二位学生从位置 3 移动到位置 4 ,移动 1 次。
- 第三位学生从位置 2 移动到位置 5 ,移动 3 次。
- 第四位学生从位置 6 移动到位置 9 ,移动 3 次。
总共 0 + 1 + 3 + 3 = 7 次移动。
样例 3:
输入:
seats = [2,2,6,6], students = [1,3,2,6]
输出:
4
解释:
学生移动方式如下:
- 第一位学生从位置 1 移动到位置 2 ,移动 1 次。
- 第二位学生从位置 3 移动到位置 6 ,移动 3 次。
- 第三位学生不移动。
- 第四位学生不移动。
总共 1 + 3 + 0 + 0 = 4 次移动。
提示:
- n == seats.length == students.length
- 1 <= n <= 100
- 1 <= seats[i], students[j] <= 100
分析
- 面对这道算法题目,我陷入了沉思。
- 如果所有学生,都在座位的左边,或者都在座位的右边,一下子就能想明白。
- 交叉的情况下呢?
学生1-座位1-学生2-座位2 - 这时候学生2可能到座位1比到座位2近。
- 但是别忘了,座位2一定要有人坐,所以学生2到座位2间的距离是必然不能省略的,不管是学生1去坐还是学生2去坐,那段路总是有人要走。
- 学生1一定要坐一个座位,不管是去坐座位1还是座位2,学生1到座位1之间的距离也是不能省略的。
- 只有座位1和学生2之间的距离可以省略。
- 这样思考具有片面性,但是事实证明,这样考虑是对的,贪心算法,局部最优解。
- 所以学生和座位排好顺序,按顺序坐吧。
题解
java
class Solution
public int minMovesToSeat(int[] seats, int[] students)
Arrays.sort(seats);
Arrays.sort(students);
int ans = 0;
int n = seats.length;
for (int i = 0; i < n; ++i)
ans += Math.abs(seats[i] - students[i]);
return ans;
c
int cmp(const void *a, const void *b)
return (*(int *) a - *(int *) b);
int minMovesToSeat(int* seats, int seatsSize, int* students, int studentsSize)
qsort(seats, seatsSize, sizeof(int), cmp);
qsort(students, studentsSize, sizeof(int), cmp);
int ans = 0;
for (int i = 0; i < seatsSize; ++i)
ans += abs(seats[i] - students[i]);
return ans;
c++
class Solution
public:
int minMovesToSeat(vector<int>& seats, vector<int>& students)
sort(seats.begin(), seats.end());
sort(students.begin(), students.end());
int ans = 0;
int n = seats.size();
for (int i = 0; i < n; ++i)
ans += abs(seats[i] - students[i]);
return ans;
;
python
class Solution:
def minMovesToSeat(self, seats: List[int], students: List[int]) -> int:
seats.sort()
students.sort()
ans = 0
for i in range(len(seats)):
ans += abs(seats[i] - students[i])
return ans
go
func minMovesToSeat(seats []int, students []int) int
sort.Ints(seats)
sort.Ints(students)
ans := 0
n := len(seats)
for i := 0; i < n; i++
if seats[i] > students[i]
ans += seats[i] - students[i]
else
ans += students[i] - seats[i]
return ans
rust
impl Solution
pub fn min_moves_to_seat(mut seats: Vec<i32>, mut students: Vec<i32>) -> i32
seats.sort();
students.sort();
let mut ans = 0;
let length = seats.len();
(0..length).for_each(|i|
ans += (seats[i] - students[i]).abs();
);
ans
原题传送门:https://leetcode-cn.com/problems/minimum-number-of-moves-to-seat-everyone/
非常感谢你阅读本文~
欢迎【👍点赞】【⭐收藏】【📝评论】~
放弃不难,但坚持一定很酷~
希望我们大家都能每天进步一点点~
本文由 二当家的白帽子:https://le-yi.blog.csdn.net/ 博客原创~
以上是关于算法2037. 使每位学生都有座位的最少移动次数(java / c / c++ / python / go / rust)的主要内容,如果未能解决你的问题,请参考以下文章
算法2037. 使每位学生都有座位的最少移动次数(java / c / c++ / python / go / rust)
LeetCode 2037. 使每位学生都有座位的最少移动次数
LeetCode 2037. 使每位学生都有座位的最少移动次数