leetcode 881.人を救うためのボート(python)

オファーが届きました。友達を掘って受け取りましょう!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.
复制代码

元のタイトルリンク

leetcode.com/problems/bo…

♥️♥️あなたのサポートは私の最大のモチベーションです♥️♥️

おすすめ

転載: juejin.im/post/7078840725953052708