小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
说明:文章部分内容及图片出自网络,如有侵权请与我本人联系(主页有公众号:小攻城狮学前端)
作者:小只前端攻城狮、 主页:小只前端攻城狮的主页、 来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
题意描述
第
i
个人的体重为people[i]
,每艘船可以承载的最大重量为limit
。每艘船最多可同时载两人,但条件是这些人的重量之和最多为
limit
。返回载到每一个人所需的最小船数。(保证每个人都能被船载)。
示例 1:
输入:people = [1,2], limit = 3 输出:1 解释:1 艘船载 (1, 2)
解法:双指针
思路分析:
- 首先默认有n条船,每只船只带1人。
- 若找到两个人的重量满足条件的,则当前2人可在同一条船,说明可节约1只船,则船只数-1。
步骤
- 重量升序
- 定义头尾指针分别指向头尾
- 船只数初始化为人数
- 判断两指针对应的重量是否满足条件,若满足条件,则可带2人,说明可节约1只船,船只数-1,左指针右移
- 不管满足不满足条件,右指针都要左移
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;
};
感谢阅读,希望能对你有所帮助,文章若有错误或者侵权,可以在评论区留言或在我的主页添加公众号联系我。
写作不易,如果觉得不错,可以「点赞」+「评论」 谢谢支持❤