🌈【LeetCode.881 救生艇】- JavaScript =>贪心+双指针

637 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。


说明:文章部分内容及图片出自网络,如有侵权请与我本人联系(主页有公众号:小攻城狮学前端)

作者:小只前端攻城狮、 主页:小只前端攻城狮的主页、 来源:掘金

GitHub:P-J27、 CSDN:PJ想做前端攻城狮

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


题意描述

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

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

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

示例 1:

输入:people = [1,2], limit = 3 输出:1 解释:1 艘船载 (1, 2)

解法:双指针

思路分析

  • 首先默认有n条船,每只船只带1人。
  • 若找到两个人的重量满足条件的,则当前2人可在同一条船,说明可节约1只船,则船只数-1。

步骤

  1. 重量升序
  2. 定义头尾指针分别指向头尾
  3. 船只数初始化为人数
  4. 判断两指针对应的重量是否满足条件,若满足条件,则可带2人,说明可节约1只船,船只数-1,左指针右移
  5. 不管满足不满足条件,右指针都要左移
const numRescueBoats = (people, limit) => {
    // 升序排序
    people.sort((a, b) => a - b);
    // 人数
    const len = people.length;
    // 初始化头尾指针
    let [i, j] = [0, len - 1];
    // 最小船只数,初始等于人数
    // 最初情况:每只船带1人
    let min = len;

    while (i < j) {
        if (people[i] + people[j] <= limit) {
            // 若两指针对应的重量满足条件,则可带2人
            // 说明可节约1只船,则min--
            min--;
            // i右移
            i++;
        }
        // 若满足条件,j要左移
        // 若不满足条件,当前船只能带1人,没有节约船只,min不用变,j还是要左移
        j--;
    }

    return min;
};

感谢阅读,希望能对你有所帮助,文章若有错误或者侵权,可以在评论区留言或在我的主页添加公众号联系我。

写作不易,如果觉得不错,可以「点赞」+「评论」 谢谢支持❤