公司计划面试 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
方法一:把costs任意分成A、B两个列表,每个长度为N,表示A集合去A地、B集合去B地。对于A集合中每个人,到B集合中遍历 看是否能互换位置,让总费用更低
class Solution:
def twoCitySchedCost(self, costs: List[List[int]]) -> int:
A = costs[:len(costs)//2]
B = costs[len(costs)//2:]
for i in range(len(A)):
for j in range(len(B)):
if A[i][1] + B[j][0] < A[i][0] + B[j][1]:
A[i], B[j] = B[j], A[i]
ret = 0
for a in A:
ret += a[0]
for b in B:
ret += b[1]
return ret
'''
方法二:把2N个人费用排序,让到B地比到A地的差价大的人排在前面,最后让前N个人去A地,后N个人去B地
class Solution:
def twoCitySchedCost(self, costs: List[List[int]]) -> int:
costs.sort(key = lambda cost:cost[1]-cost[0],reverse = True)
ret = 0
ret += sum(costs[i][0] for i in range(len(costs)//2))
ret += sum(costs[i][1] for i in range(len(costs)//2, len(costs)))
return ret