classSolution { public: intnumRescueBoats(vector<int>& people, int limit){ sort(people.begin(), people.end()); int l = 0, r = people.size() - 1, res = 0; while (l <= r) { res++; if (people[l] + people[r] <= limit) l++; r--; } return res; } };
双指针(python)
classSolution: defnumRescueBoats(self, people: List[int], limit: int) -> int: people.sort() res, l, r = 0, 0, len(people) - 1 while l <= r: res += 1 if people[l] + people[r] <= limit: l += 1 r -= 1 return res
计数排序(c++)
classSolution { public: intnumRescueBoats(vector<int>& people, int limit){ int n = people.size(); vector<int> sp(n, 0); vector<int> count(limit+1, 0); for (int i = 0; i < n; ++i) { count[people[i]]++; } for (int i = 1; i <= limit; ++i) { count[i] += count[i-1]; } for (int i = 0; i < n; ++i) { sp[count[people[i]]-1] = people[i]; count[people[i]]--; } int l = 0, r = n - 1, res = 0; while (l <= r) { res++; if (sp[l] + sp[r] <= limit) l++; r--; } return res; } };
计数排序(python)
classSolution: defnumRescueBoats(self, people: List[int], limit: int) -> int: sp = [0] * len(people) count = [0] * (limit + 1) for i in people: count[i] += 1 for i inrange(1, limit + 1): count[i] += count[i-1] for i in people: sp[count[i]-1] = i count[i] -= 1 res, l, r = 0, 0, len(people) - 1 while l <= r: res += 1 if sp[l] + sp[r] <= limit: l += 1 r -= 1 return res
后记
这题注意写循环的时候也有技巧的,我们实现的时候,对于最大值 people[r] ,先给他分配一条船,再看最小的人能否和他一条船,如果可以,那就顺便带上( l 加 1 ),如果不可以的话,那就 r 减 1 ,继续看下一个更重的人。