同社は2N人にインタビューする予定です。都市Aに飛ぶi番目の人のコストはコスト[i] [0]であり、都市Bに飛ぶコストはコスト[i] [1]です。
全員を特定の都市に飛ばす最小コストに戻るには、各都市にN人が到着する必要があります。
例:
入力:[[10,20]、[30,200]、[400,50]、[30,20]]
出力:110
説明:
最初の人は都市Aに行き、費用は10です。
2人目は30の費用で都市Aに行きます。
3人目は50の費用で都市Bに行きます。
4人目は20の費用で都市Bに行きます。
最小総費用は10+ 30 + 50 + 20 = 110であり、各都市の半分の人が面接を行っています。
促す:
1 <= cost.length <=
100costs.length修正
1 <= cost [i] [0]、costs [i] [1] <= 1000
出典:LeetCode
リンク:https ://leetcode-cn.com/problems/two-city-scheduling
著作権はLeetCodeが所有しています。商用の再版については、公式の承認に連絡してください。非商用の再版については、出典を示してください。
ps:フライトを待っている間に退屈したときに、2つの質問を書きました。これらの質問のアイデアは、すべて注釈に含まれています。
class Solution {
public int twoCitySchedCost(int[][] costs) {
//先把全部人都去a市,然后再让一半的人去b市,什么人去b市呢,就是去a市不省钱的人(没有进入省钱排行榜前一半)
//a[0]-a[1]就是看是不是去a市更省钱,再减去(b[0]-b[1])就是看谁更省钱谁就留在A市
Arrays.sort(costs,(a,b)->(a[0]-a[1]-(b[0]-b[1])) );
// 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;
//前一半的人留在a市后一半的人去b市
for (int i = 0; i < n; ++i) total += costs[i][0] + costs[i + n][1];
return total;
}
}