Problem
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.
Examples
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)
Solution
We should pair the least heavy and most heavy person together, as we are allowed at max 2 people in boat. In terms of physics that may cause imbalance, but in terms of this problem it will not. Now, we can either use maxHeap and minHeap, but that takes extra space. So, better solution is sorting and 2 pointers.
Method 1 - Sorting and Two Pointer
Here is the video explanation:
Code
Java
public int numRescueBoats(int[] people, int limit) {
Arrays.sort(people);
int numBoats = 0;
int i =0;
int j = people.length - 1;
while (i <= j){
// can we carry heaviest and lightest person
if(people[i] + people[j] <= limit){
i++;
j--;
}else {
j--;
}
numBoats++;
}
return numBoats;
}