• 力扣每日一题 6/10


    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**4
    • 1 <= people[i] <= limit <= 3 * 10**4

     题目分析:

            一艘船最多上两个人,要使船只最少那就只能让每只船载人尽可能多,那么最多就是两个人,这里对people数组进行排序(假设从小到大排),然后定义双指针分别指头和尾。判断头+尾是否大于limit:

    • 大于的话则说明尾指针指向的最大值只能单独乘船,此时应单独分配一艘船给体重最重的人。从 people中去掉体重最重的人后,我们缩小了问题的规模,变成求解剩余 n−1 个人所需的最小船数,将其加一即为原问题的答案,此时尾指针向前走,船只加一;
    • 否则则说明 头 可以和 尾  一起乘船,那么头也能与其余任何人同乘一艘船,为了尽可能地利用船的承载重量,选择与体重最重的人同乘一艘船是最优的。从 people 中去掉体重最轻和体重最重的人后,就缩小了问题的规模,变成求解剩余 n−2 个人所需的最小船数,将其加一即为原问题的答案。此时头尾都往中间走一步,船只加1。以此类推,遍历一遍过去即可出答案。

    代码实现:

    1. class Solution:
    2. def numRescueBoats(self, people: List[int], limit: int) -> int:
    3. people.sort()
    4. n=len(people)
    5. if n==1: return 1
    6. res=0
    7. st,ed=0,n-1
    8. while st<=ed:
    9. if people[st]+people[ed]<=limit:
    10. res+=1
    11. st+=1
    12. ed-=1
    13. else:
    14. res+=1
    15. ed-=1
    16. return res

    总结:

           代码的逻辑是基于贪心算法,每次尽可能多地安排乘客乘坐救生艇达到最少的船只数,最后返回res即为所需的最少船只数。具体步骤如下:

    1. 首先对乘客的重量列表进行排序,这样可以从小到大依次选择乘客。
    2. 使用双指针st和ed分别指向排序后的乘客列表的第一个和最后一个元素。
    3. 如果st指向的乘客和ed指向的乘客的重量之和不超过limit,则表示可以安排这两个乘客乘坐一艘救生艇,此时res加1,同时移动st和ed指针继续判断下一组乘客。
    4. 如果st指向的乘客和ed指向的乘客的重量之和超过limit,则只能让ed指向的乘客单独乘坐一艘救生艇,此时res加1,移动ed指针继续判断。

  • 相关阅读:
    Python模块:模块搜索顺序、内置属性(__file__和__name__)、开发原则
    利用 Pytorch 加载词向量库文件
    [数据可视化] 词云(Word Cloud)
    黑马JVM总结(十九)
    深度学习的进展,产业化,规模化、数据化
    Java进阶知识
    【43C++STL-常用算法----1、常用遍历算法】
    MPLS BGP virtual private network OptionC实验(方案二)
    HPM6750系列--第二篇 搭建Ubuntu开发环境
    华为OD机试 - 一种字符串压缩表示的解压 - 考生抽中题(Java 2023 B卷 100分)
  • 原文地址:https://blog.csdn.net/Xxy_1008/article/details/139574411