题目
第 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