leetcode 1029. 兩地調度

【題目】1029. 兩地調度

公司計劃面試 2N 人。第 i 人飛往 A 市的費用爲 costs[i][0],飛往 B 市的費用爲 costs[i][1]。
返回將每個人都飛到某座城市的最低費用,要求每個城市都有 N 人抵達。

示例:

輸入:[[10,20],[30,200],[400,50],[30,20]]
輸出:110
解釋:
第一個人去 A 市,費用爲 10。
第二個人去 A 市,費用爲 30。
第三個人去 B 市,費用爲 50。
第四個人去 B 市,費用爲 20。

最低總費用爲 10 + 30 + 50 + 20 = 110,每個城市都有一半的人在面試。

提示:
1 <= costs.length <= 100
costs.length 爲偶數
1 <= costs[i][0], costs[i][1] <= 1000

【解題思路1】

先假設全部去B市,再從中選擇N人轉去A市,那麼這N個人的多花了price_A - price_B 的費用(可正可負)
因此最優的方案是,選出 price_A - price_B 最小的 N 個人,讓他們飛去A 市,剩下的去 B 市

  • 按照 price_A - price_B 從小到大排序;
  • 將前 N 個人飛往 A 市,其餘人飛往 B 市,並計算出總費用。在這裏插入圖片描述
class Solution {
    public int twoCitySchedCost(int[][] costs) {
        // 按price_A - price_B從小到大排序
        Arrays.sort(costs, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                return o1[0] - o1[1] - (o2[0] - o2[1]);
            }
        });

        int total = 0;
        int n = costs.length / 2;
        for (int i = 0; i < n; ++i) 
            total += costs[i][0] + costs[i + n][1];
        return total;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章