[leetcode] 881. Boats to Save People

Description

You are given an array people where people[i] is the weight of the ith person, and an infinite number of boats where each boat can carry a maximum weight of limit. Each boat carries at most two people at the same time, provided the sum of the weight of those people is at most limit.

Return the minimum number of boats to carry every given person.

Example 1:

Input: people = [1,2], limit = 3
Output: 1
Explanation: 1 boat (1, 2)

Example 2:

Input: people = [3,2,2,1], limit = 3
Output: 3
Explanation: 3 boats (1, 2), (2) and (3)

Example 3:

Input: people = [3,5,3,4], limit = 5
Output: 4
Explanation: 4 boats (3), (3), (4), (5)

Constraints:

  • 1 <= people.length <= 5 * 104
  • 1 <= people[i] <= limit <= 3 * 104

分析

题目的意思是:给定一个people体重数组,和limit值,现在船是无限的,有limit限制,现在用最小的boat数目来存放people。

我参考了一下思路:首先把people按照weight从小到大进行排序,利用双指针法来求得最终的结果,i指向people的开头,j指向people的结尾,从后往前遍历,遍历的时候跟新结果res,如果people[i]+people[j]等于limit,则i需要跳跃一步。

这个贪心算法的思路有点特别,确实挺巧妙的。

代码

class Solution:
    def numRescueBoats(self, people: List[int], limit: int) -> int:
        people.sort()
        i=0
        j=len(people)-1
        res=0
        while(i<=j):
            res+=1
            if(people[i]+people[j]<=limit):
                i+=1
            j-=1
        return res

参考文献

solution

猜你喜欢

转载自blog.csdn.net/w5688414/article/details/114490781
今日推荐