救生艇

链接

第 i 个人的体重为 people[i],每艘船可以承载的最大重量为 limit。

每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit。

返回载到每一个人所需的最小船数。(保证每个人都能被船载)。

import java.util.Arrays;

class Solution {

    private int search(int[] people, int key) {

        int l = 0, r = people.length - 1, ans = -1;

        while (l <= r) {
            int mid = (l + r) >> 1;
            if (people[mid] <= key) {
                ans = mid;
                l = mid + 1;
            } else {
                r = mid - 1;
            }
        }

        return ans;
    }

    public int numRescueBoats(int[] people, int limit) {

        Arrays.sort(people);

        int mid = search(people, limit >> 1);

        int leftUnused = 0;

        int left = mid, right = mid + 1, ret = 0;

        while (left >= 0 && right < people.length) {
            if (people[left] + people[right] <= limit) {
                ret++;
                left--;
                right++;
            } else {
                leftUnused++;
                left--;
            }
        }

        return ret + (left + leftUnused + 2) / 2 + (people.length - right);
    }
}
posted @ 2021-10-14 23:45  Tianyiya  阅读(54)  评论(0)    收藏  举报