题目地址:
https://www.lintcode.com/problem/boats-to-save-people/description
给定一个正整数列表 A A A,表示每个人的重量。再给一个数 l l l表示每艘船可以承载的最大重量。每艘船最多载两人。问至少需要多少搜船才能把所有人都载完。
先排序,然后用对撞双指针,设开的两个指针分别是 i i i和 j j j并且 i < j i<j i<j,则先看 A [ j ] A[j] A[j]是否能与 A [ i ] A[i] A[i]同船,如果能,则同船,并将 i i i右移将 j j j左移;否则 A [ j ] A[j] A[j]要单独坐船,则只将 j j j左移。相遇的时候,还要将剩下的那个人单独坐船。代码如下:
import java.util.List;
public class Solution {
/**
* @param people: The i-th person has weight people[i].
* @param limit: Each boat can carry a maximum weight of limit.
* @return: Return the minimum number of boats to carry every given person.
*/
public int numRescueBoats(List<Integer> people, int limit) {
// Write your code here.
people.sort((p1, p2) -> Integer.compare(p1, p2));
int res = 0, i = 0, j = people.size() - 1;
while (i < j) {
if (people.get(i) + people.get(j) <= limit) {
i++;
}
j--;
res++;
}
// 如果i == j说明还剩下一个单独的人,他自己坐船
return res + (i == j ? 1 : 0);
}
}
时间复杂度 O ( n log n ) O(n\log n) O(nlogn), n n n是人数,空间 O ( 1 ) O(1) O(1)。