当前位置: 首页 > 科技观察

日工算法:两指针求解“救生艇”问题

时间:2023-03-21 18:19:59 科技观察

本文带来了“救生艇”问题的两指针求解法~冲~~题目:给定一个人数组。people[i]代表第i个人的体重,船的数量不限,每条船能承载的最大重量是limit。每艘船最多可以同时载两个人,但条件是这些人的重量总和最多为极限。返回承载所有这些所需的最少船只数量。示例1:输入:people=[1,2],limit=3输出:1解释:1shipwith(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艘船Shipscontain(3),(3),(4),(5)作者:掘金安东尼链接:https://juejin.cn/post/7062623455652347911来源:稀土掘金版权归作者所有。商业转载请联系作者授权,非商业转载请注明出处。注:1<=people.length<=5*1041<=people[i]<=limit<=3*104解题思路:每个人的重量不会超过limit;每艘船只能乘坐两个人;每艘船的重量不能超过限制;我们可以考虑对给定的数组进行排序,先选出体重最大的人,看能不能和体重最小的人共乘一条船,如果可以,就让他们在一起,如果不行,就让最重的人在一起weight肯定不能和其他人成对,那就让他一个人再看weight次大的人,同样的,看他和weight的关系是不是最小的人(假设weight最大是单)可以组成一对,就这样一直比较。不失一般性,我们先排序顺序,再考虑使用双指针。最初,两个指针指向两端:当体重最重的人独自一人时,指针移动到中间;与体重最小的人结对,将两人的指针移到中间;代码思路:排序并初始化双指针遍历,每次使用最重和最轻的pair,如果两者的权重小于或等于限制,Lightboarding(left++)。不管最轻的在不在船上,最重的一定在船上(对--)。所需的船数加一(nums++)JavaScript实现:/***@param{number[]}people*@param{number}limit*@return{number}*/varnumRescueBoats=function(people,limit){people.sort((a,b)=>(a-b))letleft=0letright=people.length-1letnums=0while(left<=right){if(people[left]+people[right]<=limit){left++}right--nums++}returnnums};作者:掘金安东尼链接:https://juejin.cn/post/7062623455652347911来源:稀土掘金版权归作者所有。商业转载请联系作者授权,非商业转载请注明出处。