算法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. 使每位学生都有座位的最少移动次数

LeetCode笔记:Biweekly Contest 63

Leetcode 462.最少移动次数使数组元素相等

462. 最少移动次数使数组元素相等 II