华为OD 面试手撕代码真题【救生艇】

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

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

        这个题目和之前的机试题:租车骑绿岛,几乎一致,有兴趣的小伙伴可以搜一下我的博客看看。

        题目依然是面试官给到一个leetcode题号,然后让你直接去leetcode上做题,提交,看通过率。这个题目还是比较简单的,但是要注意读题。题目很重视细节。读题的时候每句话读完都要停顿三秒思考一下。这道题的关键就在于【每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit】

要使需要的船数尽可能地少,应当使载两人的船尽可能地多。

贪心算法流程:

设 people 的长度为 n。考虑体重最轻的人:

若他不能与体重最重的人同乘一艘船,那么体重最重的人无法与任何人同乘一艘船,此时应单独分配一艘船给体重最重的人。从 people 中去掉体重最重的人后,我们缩小了问题的规模,变成求解剩余 n−1 个人所需的最小船数,将其加一即为原问题的答案。
若他能与体重最重的人同乘一艘船,那么他能与其余任何人同乘一艘船,为了尽可能地利用船的承载重量,选择与体重最重的人同乘一艘船是最优的。从 people 中去掉体重最轻和体重最重的人后,我们缩小了问题的规模,变成求解剩余 n−2 个人所需的最小船数,将其加一即为原问题的答案。
在代码实现时,我

猜你喜欢

转载自blog.csdn.net/misayaaaaa/article/details/131161585
今日推荐