给定数组 people 。people[i]表示第 i 个人的体重 ,船的数量不限,每艘船可以承载的最大重量为 limit。
每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit。
返回 承载所有人所需的最小船数 。
示例 1:
输入:people = [1,2], limit = 3
输出:1
解释:1 艘船载 (1, 2)
示例 2:
输入:people = [3,2,2,1], limit = 3
输出:3
解释:3 艘船分别载 (1, 2), (2) 和 (3)
示例 3:
输入:people = [3,5,3,4], limit = 5
输出:4
解释:4 艘船分别载 (3), (3), (4), (5)
提示:
1 <= people.length <= 5 * 104
1 <= people[i] <= limit <= 3 * 104
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/boats-to-save-people
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
算法分析:
1.将数组排好序(因为这样可以具有单调性)
2.双指针,一前一后(看一个体重轻的和一个体重重的小不小于等于船承重)
2.1.<= : l++,r--;
2.2. > : r--;
java:
class Solution {
public int numRescueBoats(int[] people, int limit) {
Arrays.sort(people);
int l=0;
int r=people.length-1;
int ans = 0;
while(l<=r){
if(people[l]+people[r]<=limit){
l++;
}
r--;
ans++;
}
return ans;
}
}
C语言:
void swap(int q[],int i,int j){
int t=q[i];
q[i]=q[j];
q[j]=t;
}
void quickSort(int q[],int l,int r){
if(l>=r) return ;
int i=l-1;
int j=r+1;
int x=q[(r-l)/2+l];
while(i<j){
do ++i; while(q[i]<x);
do --j; while(q[j]>x);
if(i<j){
swap(q,i,j);
}
}
quickSort(q,l,j);
quickSort(q,j+1,r);
}
int numRescueBoats(int* people, int peopleSize, int limit){
quickSort(people,0,peopleSize-1);
int left=0,right=peopleSize-1,ans=0;
while(left<=right)
{
if(people[left]+people[right]<=limit)
{
++left;
}
--right;
++ans;
}
return ans;
}