881. 救生艇

August 26, 2021

题目:881. 救生艇

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

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

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

刚开始读完题目在想是不是需要用动态规划?但我又不太会,那还是用回溯算法试试吧。等看完示例,思考一阵之后发现根本不用这么复杂。

首先根据题意每艘船最多只能乘坐两个人,然后题目问的是“最少多少个小船能坐下“,那么说明每人的体重都小于等于船的 limit。

那么,解题思路:首先给数组排序从大到小(从小到大也行)顺序,然后定义左右指针,数组两端的数值相加小于等于 limit 就乘坐两个人,反之就乘坐一个人。没错,这个中等的题就这么简单。

var numRescueBoats = function (people, limit) {
  people.sort((a, b) => b - a)
  let left = 0
  let right = people.length - 1
  let count = 0
  while (left <= right) {
    count++
    if (people[left] + people[right] <= limit) {
      right--
    }
    left++
  }
  return count
}