日拱算法:双指针解“救生艇”问题

简介: 给定数组 people 。people[i]表示第 i 个人的体重 ,船的数量不限,每艘船可以承载的最大重量为 limit。每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit。

image.png

本篇带来 “救生艇”问题的双指针解法~冲~~


题目:


给定数组 people 。people[i]表示第 i 个人的体重 ,船的数量不限,每艘船可以承载的最大重量为 limit。


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

返回 承载所有人所需的最小船数 。


示例 1:
输入:people = [1,2], limit = 3
输出:1
解释:1 艘船载 (1, 2)
示例 2:
输入:people = [3,2,2,1], limit = 3
输出:3
解释:3 艘船分别载 (1, 2), (2) 和 (3)
示例 3:
输入:people = [3,5,3,4], limit = 5
输出:4
解释:4 艘船分别载 (3), (3), (4), (5)


注:

  • 1 <= people.length <= 5 * 104
  • 1 <= people[i] <= limit <= 3 * 104


解题思路


题意拆解:

  1. 每个人的重量不会超过 limit;
  2. 每艘船最多只能坐两个人;
  3. 每艘船的重量不能超过 limit;


我们可以考虑把给定的数组排序,先选重量最大的人,看它与重量最小的人能不能合坐一艘船,如果可以,就让他们在一起,如果不可以,那么,最大重量的人肯定跟其余所有人都不能组成一对了,那就让他单着。


然后,再看重量次大的人,同样地,看看他与重量最小的人(假设最大重量是单着的)能不能组成一对,这样子一直比下去即可。


不失一般性地,我们先排好序,然后考虑使用双指针,初始时,两个指针指向两头:

当重量最大的人单着的时候,其指针往中间移动一位;


当重量最大的人与重量最小的人组成一对,他们俩的指针各往中间移动一位;


代码思路:

  1. 排序
  2. 初始化双指针
  3. 遍历,每次都用最重的和最轻的配对,如果两人体重小于等于limit,轻的上船(left++)。不论最轻的是否上船重的都要上船(right--)。所需船数加一(nums++)


JavaScript 实现:


/**
 * @param {number[]} people
 * @param {number} limit
 * @return {number}
 */
var numRescueBoats = function(people, limit) {
    people.sort((a,b)=>(a-b))
    let left = 0
    let right = people.length-1
    let nums=0
    while(left<=right){
        if(people[left]+people[right]<=limit){
            left++
        }
        right--
        nums++
    }
    return nums
};


OK,以上便是本篇分享~


相关文章
|
6天前
|
算法 前端开发 JavaScript
< 每日算法:一文带你认识 “ 双指针算法 ” >
`双指针`并非指的是一种具体的公式或者范式。而是一种运算思路,用于节省逻辑运算时间的`逻辑思路`!双指针算法通常用于`优化时间复杂度`!
< 每日算法:一文带你认识 “ 双指针算法 ” >
|
11天前
|
算法
|
17天前
|
算法
优选算法|【双指针】|202.快乐数
优选算法|【双指针】|202.快乐数
|
18天前
|
算法
【优选算法专栏】专题一:双指针--------1.移动0
【优选算法专栏】专题一:双指针--------1.移动0
19 0
|
1月前
|
算法 关系型数据库 MySQL
大厂算法指南:优选算法 ——双指针篇(下)
大厂算法指南:优选算法 ——双指针篇(下)
27 0
|
1月前
|
算法 容器
算法思想总结:双指针算法
算法思想总结:双指针算法
|
1月前
|
存储 算法 容器
【优选算法】—— 双指针问题
【优选算法】—— 双指针问题
【优选算法】—— 双指针问题
|
1月前
|
算法
我对双指针算法认知
我对双指针算法认知
|
2月前
|
算法 测试技术 C++
【双指针】【C++算法】1537. 最大得分
【双指针】【C++算法】1537. 最大得分
|
2月前
|
算法
【算法优选】双指针专题——叁
【算法优选】双指针专题——叁