leetcode
leetcode 951 ~ 1000
两地调度

两地调度

难度:

标签:

题目描述

代码结果

运行时间: 24 ms, 内存: 16.1 MB


/*
 * 思路:
 * 1. 计算每个人去a市和b市的成本差
 * 2. 根据成本差对costs进行排序
 * 3. 选择前n个人去a市,后n个人去b市
 */

import java.util.Arrays;
import java.util.Comparator;

public class Solution {
    public int twoCitySchedCost(int[][] costs) {
        return Arrays.stream(costs)
                // 按照去a市和b市的成本差进行排序
                .sorted(Comparator.comparingInt(a -> a[0] - a[1]))
                // 将前n个人去a市的费用和后n个人去b市的费用相加
                .mapToInt((cost, index) -> index < costs.length / 2 ? cost[0] : cost[1])
                .sum();
    }

    public static void main(String[] args) {
        Solution sol = new Solution();
        int[][] costs = {{10, 20}, {30, 200}, {400, 50}, {30, 20}};
        System.out.println(sol.twoCitySchedCost(costs));  // 输出: 110
    }
}

解释

方法:

此题解的思路是首先计算每个人去A市和B市的费用差,并基于此差值进行决策。首先,对于每个人,如果去A市比去B市便宜,就先选定其去A市,反之则去B市。之后,根据已选的结果检查A市和B市是否人数均为n。如果某城市人数过多,将需要重新考虑一些人的目的地,选取使总成本最小增加的方案。这通过计算差值的绝对值最小的调整来实现,以确保在调整人数以满足条件时增加的成本最小。

时间复杂度:

O(n^2)

空间复杂度:

O(n)

代码细节讲解

🦆
解题思路中提到的'成本差'是如何计算的?具体是哪两个成本之间的差异?
在题解中,每个人去A市和去B市的成本差是通过计算'去A市的成本'与'去B市的成本'之间的差值来得到的。具体来说,对于数组中的每个元素`costs[i] = [aCosti, bCosti]`,成本差计算为`aCosti - bCosti`。这个差值反映了个人去A市相较于去B市的额外成本,如果值为正,则表示去B市更便宜;如果值为负,则表示去A市更便宜。
🦆
为什么在初步分配后,选择将成本差较小的个体进行重新分配,而不是直接选择成本最高的个体?
在初步分配后,选择进行调整的策略是基于成本差的大小,而不是直接基于个体的总成本。这是因为我们的目标是调整分配以平衡两个城市的人数,同时尽量减少总成本的增加。选择成本差较小的个体进行重新分配意味着这些个体从一个城市转移到另一个城市的额外成本较低,从而能更有效地控制总成本的增加。如果选择成本最高的个体,可能会导致总成本大幅增加,这不符合最小化总成本的目标。
🦆
题解中提到的调整策略是否保证了最终的总成本是最低的?是否存在更优的调整策略?
题解中提出的调整策略基于最小化因调整分配而增加的额外成本,这通常可以帮助接近最小总成本的解决方案,但不一定总能保证得到全局最优解。存在可能的更优策略,如使用动态规划、贪心算法的改进版本或其他优化算法来更全面地考虑所有可能的分配方式,从而可能找到一个更低的总成本。此外,可以通过模拟退火或遗传算法等启发式算法来探索可能的更好解决方案,尤其是在问题规模较大时。

相关问题