【Lintcode】1601. Boats to Save People

题目地址:

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值