Problem 881 Boats to Save People
Table of Contents
Problem Statement
Link - Problem 881
Question
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 * 10^41 <= people[i] <= limit <= 3 * 10^4
Solution
class Solution {
public:
int numRescueBoats(vector<int>& people, int limit) {
std::ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
sort(people.begin(),people.end());
int left = 0,right = people.size()-1;
int answer = 0;
while(left<=right)
{
if(people[left]+people[right]>limit)
{
answer++;
right--;
}
else
{
answer++;
left++;
right--;
}
}
return answer;
}
};
Complexity Analysis
Time: O(nlogn)Space: O(1)
Explanation
1. Intuition
- We can see that the number of boats needed at minimum is
n/2wherenis the number of people. - Maximum number of boats needed is
nwhere each person is in a separate boat. - The idea is to give the heaviest person a boat and then check if the lightest person can be accomodated in the same boat.
- If the lightest person can be accomodated then we can move to the next lightest person.
- If the lightest person cannot be accomodated then we need to give the heaviest person a separate boat.
2. Code explained
- Sort the given vector.
- Initialize two pointers
leftandrightat the start and end of the vector. - Initialize the
answervariable to0. - Iterate over the vector until
leftis less than or equal toright. - If the sum of the weights of the people at
leftandrightis greater than thelimitthen we need to give the person atrighta separate boat. - If the sum of the weights of the people at
leftandrightis less than or equal to thelimitthen we can accomodate both the people in the same boat. - Increment the
answervariable accordingly. - Return the
answervariable.
Note : This is a very simple problem and can be solved using the two pointer approach. The idea is to sort the given vector and then use two pointers to iterate over the vector. The time complexity of this approach is
O(nlogn)wherenis the number of people. The space complexity isO(1).