方法一:排序、贪心
思路与算法
将位置和学生分别排序,然后对差的绝对值求和。交换位置不会得到更优的答案。可以交换后分情况讨论得出结论。
前提:
- ans1 = abs(a0 - b0) + abs(a1 - b1)
- a0 <= a1, b0 <= b1
- ans2 = abs(a0 - b1) + abs(a1 - b0)
分情况:
- a0 <= a1 <= b0 <= b1, 得到 ans1 == ans2
- a0 <= b0 <= a1 <= b1, 得到 ans1 = b0 - a0 + b1 - a1, ans2 = b1 - a0 + a1 - b0, 得到 ans1 <= ans2
- a0 <= b0 <= b1 <= a1, 得到 ans1 = b0 - a0 + a1 - b1, ans2 = b1 - a0 + a1 - b0, 得到 ans1 - ans2 = 2 * b0 - 2 * b1 <= 0, 得到 ans1 <= ans2
- b0 <= a0 <= b1 <= a1, 得到 ans1 - ans2 = (a0 - b0 + a1 - b1) - (b1 - a0 + a1 - b0) = 2 * (a0 - b1) <= 0, 得到 ans1 <= ans2
- b0 <= b1 <= a0 <= a1, 得到 ans1 - ans2 = (a0 - b0 + a1 - b1) - (a0 - b1 + a1 - b0) = 0,得到 ans1 == ans2
综合所有情况,ans1 <= ans2,交换位置不会得到更优解
排序后相减的答案就是最优。
代码
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;
}
}
复杂度分析
时间复杂度:O(nlogn),排序的时间复杂度。
空间复杂度:O(logn),排序的递归调用栈空间。