投资20万做网站好吗,张泽华营销,网站建设报告 宣传,网站首页界面设计881.救生艇[中等]
题目#xff1a;
给定数组 people 。people[i]表示第 i 个人的体重 #xff0c;船的数量不限#xff0c;每艘船可以承载的最大重量为 limit。
每艘船最多可同时载两人#xff0c;但条件是这些人的重量之和最多为 limit。
返回 承载所有人所需的最小船…
881.救生艇[中等]
题目
给定数组 people 。people[i]表示第 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) 提示
1 people.length 5 * 10**41 people[i] limit 3 * 10**4 题目分析 一艘船最多上两个人要使船只最少那就只能让每只船载人尽可能多那么最多就是两个人这里对people数组进行排序(假设从小到大排)然后定义双指针分别指头和尾。判断头尾是否大于limit:
大于的话则说明尾指针指向的最大值只能单独乘船此时应单独分配一艘船给体重最重的人。从 people中去掉体重最重的人后我们缩小了问题的规模变成求解剩余 n−1 个人所需的最小船数将其加一即为原问题的答案此时尾指针向前走船只加一否则则说明 头 可以和 尾 一起乘船那么头也能与其余任何人同乘一艘船为了尽可能地利用船的承载重量选择与体重最重的人同乘一艘船是最优的。从 people 中去掉体重最轻和体重最重的人后就缩小了问题的规模变成求解剩余 n−2 个人所需的最小船数将其加一即为原问题的答案。此时头尾都往中间走一步船只加1。以此类推遍历一遍过去即可出答案。
代码实现
class Solution:def numRescueBoats(self, people: List[int], limit: int) - int:people.sort()nlen(people)if n1: return 1res0st,ed0,n-1while sted:if people[st]people[ed]limit:res1st1ed-1else:res1ed-1return res
总结 代码的逻辑是基于贪心算法每次尽可能多地安排乘客乘坐救生艇达到最少的船只数最后返回res即为所需的最少船只数。具体步骤如下
首先对乘客的重量列表进行排序这样可以从小到大依次选择乘客。使用双指针st和ed分别指向排序后的乘客列表的第一个和最后一个元素。如果st指向的乘客和ed指向的乘客的重量之和不超过limit则表示可以安排这两个乘客乘坐一艘救生艇此时res加1同时移动st和ed指针继续判断下一组乘客。如果st指向的乘客和ed指向的乘客的重量之和超过limit则只能让ed指向的乘客单独乘坐一艘救生艇此时res加1移动ed指针继续判断。