【Leetcode每日一题】881. 救生艇



题目

第 i 个人的体重为 people[i],每艘船可以承载的最大重量为 limit。

每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit。

返回载到每一个人所需的最小船数。(保证每个人都能被船载)。

示例

示例1

输入:people = [1,2], limit = 3
输出:1
解释:1 艘船载 (1, 2)

示例2

输入:people = [3,2,2,1], limit = 3
输出:3
解释:3 艘船分别载 (1, 2), (2) 和 (3)

示例3

输入:people = [3,5,3,4], limit = 5
输出:4
解释:4 艘船分别载 (3), (3), (4), (5)


关键思路

使用贪心策略,即优先考虑剩余承载量最小的船,是否能够承载当前的人。

我们需要维护一个记录船只载人的列表,每次循环时,都要按照船的剩余承载量,进行从小到大排序。

注意每只船上最多只能载两个人。

代码实现

class Solution(object):
    def numRescueBoats(self, people, limit):
        """
        :type people: List[int]
        :type limit: int
        :rtype: int
        """

        boats = [[]]

        for person in people:
            for i in range(len(boats)):
                boats.sort(key=lambda x: sum(x), reverse=True)  # keep
                if person + sum(boats[i]) <= limit and len(boats[i]) < 2:
                    boats[i].append(person)  # add person into boat
                    break
                elif i == len(boats)-1:
                    boats.append([person])  # add an extra boat

        return len(boats)


if __name__ == "__main__":
    people = input()
    limit = input()
    obj = Solution()
    result = obj.numRescueBoats(people, limit)
    print(result)

运行结果

1
3
4

链接

https://leetcode-cn.com/problems/boats-to-save-people

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值