オファーが届きました。友達を掘って受け取りましょう!2022年春の採用チェックインイベントに参加しています。クリックしてイベントの詳細を表示してください
説明
people [i]がi番目の人の体重である配列の人と、各ボートが最大重量の制限を運ぶことができる無数のボートが与えられます。各ボートは、最大2人の乗客を同時に運ぶことができます。ただし、それらの人の体重の合計が最大で制限されている場合に限ります。指定されたすべての人を運ぶためのボートの最小数を返します。
例1:
Input: people = [1,2], limit = 3
Output: 1
Explanation: 1 boat (1, 2)
复制代码
ノート:
1 <= people.length <= 5 * 10^4
1 <= people[i] <= limit <= 3 * 10^4
复制代码
解析
質問の意味によると、人[i]がi番目の人の体重である配列の人が与えられ、ボートの数が無限である場合、各ボートは最大重量制限を運ぶことができます。各ボートは、最大2人を同時に運ぶことができます。ただし、これらの人の合計重量が最大で制限されている場合に限ります。指定された人を輸送するボートの最小数を返します。
この質問は、欲張りアルゴリズムを調べるためのもう1つの古典的な質問です。この質問では、最大2人がベッドに置かれ、2人の体重が制限を超えないようにする必要があります。最も単純な考え方を使用して、最初に新しい質問を取り出します。ボートは、最も太った人を最初に配置し、次に、使用されるボートの数を最小限に抑えるために、十分なスペースを残して軽い人をボートに入れることができるかどうかを確認する必要があります。
- まず、人を昇順で並べ替えます
- 次に、フロントポインターとリアポインターiとjを定義し、whileループでそれぞれ中央に移動します。iポインターは可能な限り軽い人を指し、jポインターは可能な限り体重のある人を指します。 、太った人はボートに乗らなければならないので、結果を1つ増やす必要があり、人[i]と人[j]の合計が制限以下であると判断された場合、それは最も軽いことを意味します人をボートに入れることができ、次の重量を見つけるためにiを1つずつ追加します。軽い人。それ以外の場合は、詰めることができず、1人しかボートに入れることができず、jは次のように減らされます。次の重い人を見つけるために1つ、そして上記のサイクルはj>iがサイクルから飛び出すまで続きます
- ループが終わったら、結果に戻るだけです
時間計算量はO(N)であり、空間計算量はO(1)です。
答え
class Solution(object):
def numRescueBoats(self, people, limit):
"""
:type people: List[int]
:type limit: int
:rtype: int
"""
result = 0
people.sort()
i = 0
j = len(people) -1
while i <= j:
result += 1
if people[i] + people[j] <= limit:
i += 1
j -= 1
return result
复制代码
運転結果
Runtime: 808 ms, faster than 9.67% of Python online submissions for Boats to Save People.
Memory Usage: 18.7 MB, less than 65.81% of Python online submissions for Boats to Save People.
复制代码
元のタイトルリンク
♥️♥️あなたのサポートは私の最大のモチベーションです♥️♥️