题目:
一个房间里有 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 次移动。
思路:利用贪心算法,先将两个数组先依次排序,再进行遍历,把两者差的绝对值加起来就是要移动的步数
语法知识:
- sort(seats.begin(),seats.end()) sort()函数是C++标准库中的一种排序算法,它可以按照默认的升序方式对容器中的元素进行排序。seats.begin()和seats.end()是两个迭代器,表示排序的范围,即从seats的第一个元素开始到最后一个元素的下一个位置。
- abs(students[i]-seats[i])
abs(students[i]-seats[i])表示计算students[i]和seats[i]之间的差的绝对值。
abs() 是C++标准库中的绝对值函数,用于返回一个数的绝对值。在这里,它被用于计算 students[i] 和 seats[i] 之间的差的绝对值。
例如,如果 students[i] 的值为5,seats[i] 的值为3,那么 abs(students[i]-seats[i]) 的结果就是2。
代码:
class Solution {
public:
int minMovesToSeat(vector<int>& seats, vector<int>& students) {
int move = 0;
sort(seats.begin(),seats.end());
sort(students.begin(),students.end());
for(int i=0;i<seats.size();i++)
{
move+=abs(students[i]-seats[i]);
}
return move;
}
};
文章讲述了如何使用贪心算法和排序技巧,通过比较学生和座位在数轴上的位置,计算并返回使所有学生都有座位且不重叠所需的最少移动次数。通过先对两数组排序,然后计算每个学生与对应座位的绝对值差累积求解。
31万+

被折叠的 条评论
为什么被折叠?



