LeetCode:1029. Two City Scheduling - Python

189 篇文章 3 订阅
151 篇文章 2 订阅
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)先理解题目,就是有2N人去面试,共有AB两个城市,每个城市去N人,然后是达到花费最少。题目已经提示贪心算法

(2)第一步,先不考虑去每个城市的人数,每次选择最优的城市去,即可(贪心思想),此时,并记录,如果去另外一个城市多出的花费。例如,去A10,去B20,那就现在优先考虑去A,然后开辟一个数组,记录此时如果去B差价,很显然是10

(3)现在开始分析,是不是两个城市都去了N人,如去A城市的人多了,说明要从中选取多余的人改去B城市,现在怎么选择哪?利用之前记录的差价,进行排序,依次从最小的开始进行改去B市,其中这也是贪心思想。同理,去B市的人多了,就选择一部去A市。

Python3实现:

class Solution():
    def twoCitySchedCost(self, costs):

        N = len(costs)//2
        ans = 0
        diffa, diffb = [], []

        for cost in costs:  # 贪心思想,进行处理
            if cost[0] < cost[1]:  # 去A城市
                ans += cost[0]     # 记录总的花费
                diffb.append(cost[1]-cost[0])  # 并记录如果去B城市,多花的钱,保存到 diffb
            else:                 # 同理,去B城市 ...
                ans += cost[1]
                diffa.append(cost[0]-cost[1])

        if len(diffa) < len(diffb):  # 分配到A城市的人多,则,从B里面,根据最优原则,选出几人,去B城市
            diffb.sort()
            for j in range(len(diffb)-N):
                ans += diffb[j]

        if len(diffa) > len(diffb):  # 同理,分配到B城市的人多 ...
            diffa.sort()
            for i in range(len(diffa)-N):
                ans += diffa[i]

        return ans


if __name__ == '__main__':
    solu = Solution()
    costs = [[10, 20], [30, 200], [400, 50], [30, 20]]
    print(solu.twoCitySchedCost(costs))

声明: 总结学习,有问题或不当之处,可以批评指正哦,谢谢。

题目链接参考链接

给定一个整数数组 nums 和一个目标值 target,要求在数组中找出两个数的和等于目标值,并返回这两个数的索引。 思路1:暴力法 最简单的思路是使用两层循环遍历数组的所有组合,判断两个数的和是否等于目标值。如果等于目标值,则返回这两个数的索引。 此方法的时间复杂度为O(n^2),空间复杂度为O(1)。 思路2:哈希表 为了优化时间复杂度,可以使用哈希表来存储数组中的元素和对应的索引。遍历数组,对于每个元素nums[i],我们可以通过计算target - nums[i]的值,查找哈希表中是否存在这个差值。 如果存在,则说明找到了两个数的和等于目标值,返回它们的索引。如果不存在,将当前元素nums[i]和它的索引存入哈希表中。 此方法的时间复杂度为O(n),空间复杂度为O(n)。 思路3:双指针 如果数组已经排序,可以使用双指针的方法来求解。假设数组从小到大排序,定义左指针left指向数组的第一个元素,右指针right指向数组的最后一个元素。 如果当前两个指针指向的数的和等于目标值,则返回它们的索引。如果和小于目标值,则将左指针右移一位,使得和增大;如果和大于目标值,则将右指针左移一位,使得和减小。 继续移动指针,直到找到两个数的和等于目标值或者左指针超过了右指针。 此方法的时间复杂度为O(nlogn),空间复杂度为O(1)。 以上三种方法都可以解决问题,选择合适的方法取决于具体的应用场景和要求。如果数组规模较小并且不需要考虑额外的空间使用,则暴力法是最简单的方法。如果数组较大或者需要优化时间复杂度,则哈希表或双指针方法更合适。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值