881. 救生艇

给定数组 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值