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.
Constraints
- 1 <= people.length <= 5 * 104
- 1 <= people[i] <= limit <= 3 * 104
Examples
- Example 1:
 Input:people = [1,2], limit = 3Output: 1
 Explanation:1 boat (1, 2)
- Example 2:
 Input:people = [3,2,2,1], limit = 3n = 1, bad = 1Output:3
 Explanation:3 boats (1, 2), (2) and (3)
- Example 3:
 Input:people = [3,5,3,4], limit = 5Output:4
 Explanation:4 boats (3), (3), (4), (5)
Solution 1: Sorting + Two Pointers
Thought
According to the question, each boat can carry a maximum of two people. Therefore, the best scenario is to arrange two passengers, one heavy and one light, on the same boat. This way, we can minimize the total number of boats required. We can achieve this by sorting the input array and using a two-pointer approach.
Steps
- Initialize the variable boats_numberto keep track of the current total number of boats required.
- Initialize two pointers, iandj, and start moving them from the beginning and end of thepeoplearray, respectively.
- Sort the peoplearray in ascending order.
- When the ipointer is less than or equal to thejpointer, try to place the two people at positionsiandjonto the boat:- If the total weight of the two people (people[i] + people[j]) is less than or equal to thelimit, it means we can take both of them on the same boat. Move theipointer to the right and also move thejpointer to the left.
- If the total weight of the two people is greater than the limit, it means that the current boat can only carry the person with the greater weight (people[j]). Move thejpointer to the left.
- Increase the boats_numberby 1.
 
- If the total weight of the two people (
- Finally, return the value of boats_number.
Codes
def num_rescue_boats(people: List[int], limit: int) -> int:
    boats_number = 0
    i = 0
    j = len(people) - 1
    people.sort()
    while i <= j:
        if people[i] + people[j] <= limit:
            i += 1
            j -= 1
        else:
            j -= 1
		boats_number += 1
    return boats_numberComplexities
- Time Complexity: O(NlogN), whereNis the length of thepeoplearray.
- Space Complexity: O(1)
References
- LeetCode link: Boats to Save People – LeetCode


