leetcode每日一题·救生艇问题(Python)

本文详细解析了LeetCode中的一道题目——救生艇问题,通过Python代码实现。问题核心在于将一组人按体重两两组合,确保不超过限制重量。首先对数组进行排序,然后使用双指针法,分别指向最轻和最重的人,根据组合重量与限制比较决定移动指针,最终得到所需船只数量。
摘要由CSDN通过智能技术生成

leetcode每日一题·救生艇问题(Python)

问题描述

在这里插入图片描述

题目入口

题目思路

首先分析问题,一个船最多坐两人,因此我们可以把这个问题看作两两组合的问题,并且如果最重的那个人和最轻的人加起来大于limit的话,说明最重的那个人是要一个人坐船的,此外,如果最重的人和最轻的人正好同坐一条船,那么就可以将它俩分配到一条船上去。
因此在写代码时,首先将数组排序,分别指向首尾坐标,判断当前最轻+最重是否大于limit,大于的话,最重的人坐船,船数+1,尾坐标前移,如果小于,那么最轻和最重两人一起坐船,首坐标后移,尾坐标前移,船数+1。因为考虑到最后一次人数是一人还是两人的问题,如果一人,那么首坐标和尾坐标指向同一个人时,一个人坐船离开,亦或者剩余最后两个人都坐船离开,因此判断条件为首坐标>尾坐标,跳出循环。
代码如下:

class Solution:
    def numRescueBoats(self, people: List[int], limit: int) -> int:
        # 代表船的个数
        n = 0
        # 排序
        people.sort()
        # 指向最轻的人的下标
        head = 0
        # 指向最重的人的下标
        tail = len(people) - 1
        while head <= tail:
            if people[head] + people[tail] > limit:
                tail -= 1
            else:
                head += 1
                tail -= 1
            n += 1
        return n

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值