双指针实现贪心解决救生艇最小船数问题

881. 救生艇
要使需要的船数尽可能地少,应当使载两人的船尽可能地多。
设people 的长度为 n。考虑体重最轻的人:

  1. 若他不能与体重最重的人同乘一艘船,那么体重最重的人无法与任何人同乘一艘船,此时应单独分配一艘船给体重最重的人。
    从people中去掉体重最重的人后,我们缩小了问题的规模,变成求解剩余n-1个人所需的最小船数,将其+1即为原问题的答案。
  2. 若他能与体重最重的人同乘一艘船,那么他能与其余任何人同乘一艘船,为了尽可能地利用船的承载重量,选择与体重最重的人同乘一艘船是最优的。
    从 people中去掉体重最轻和体重最重的人后,我们缩小了问题的规模,变成求解剩余n−2个人所需的最小船数,将其+1即为原问题的答案。

在代码实现时,我们可以先对people 排序,然后用两个指针分别指向体重最轻和体重最重的人,按照上述规则来移动指针,并统计答案。

import java.util.Arrays;

public class Solution {
    public int numRescueBoats(int[] people, int limit) {
        //贪心
        int ans = 0;
        Arrays.sort(people);
        int light = 0;
        int heavy = people.length - 1;
        while (light <= heavy) {
            if (people[light] + people[heavy] <= limit) {
                light++;
            }
            heavy--;
            ans++;
        }
        return ans;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值