Leetcode task03

1.ルックアップテーブル

1.1ルックアップテーブルとは

ルックアップテーブルは、同じタイプのデータ要素のコレクションです。
基本的なデータ構造を考えてみましょう。ルックアップテーブルは次のように分割できます。

  • 最初のカテゴリ:存在セットの検索

要素「a」が存在するかどうか、通常はset:set。セットはキーのみを格納し、対応する値に対応する必要はありません。セット内のキーを繰り返すことはできません

  • 2番目のカテゴリ:対応を見つける(キーと値の対応)-dict

要素「a」は数回表示されます:dict->辞書。dictのキーを繰り返すことはできません

  • 3番目のカテゴリ:マッピング関係の変更-マップ

元のシーケンスのリレーショナルマッピングを他のものと一律に表現することにより、テーブル内のデータ要素を変更せずにルックアップテーブルでルックアップ操作のみが実行され、このタイプのルックアップテーブルは静的ルックアップテーブルと呼ばれます。逆に、ルックアップ操作はルックアップテーブルで実行されます。同時に、データの挿入または削除の操作が実行され、このタイプのテーブルは動的ルックアップテーブルと呼ばれます。

1.2ルックアップテーブルのアルゴリズムアプリケーション

1.2.1 3492つのアレイの交差1

ここに写真の説明を挿入

class Solution:
    def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
        nums1 = set(nums1)
        return set([i for i in nums2 if i in nums1])

セットを使用して交差します。

class Solution:
    def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
    	return set(num1)&set(num2)

2.衝突ポインター

2.1アルゴリズムの定義

コリジョンポインタの定義はソートされた配列であり、それぞれ左端と右端を指す2つのポインタがあります。ターゲット値と比較し、ポインタと右ポインタを動的に移動してターゲット値に近づけることができます。 。
コリジョンポインタでは、配列を並べ替える必要があることに注意してください。
順序付けされていないリストの場合、コリジョンポインター方式の時間の複雑さは、nlognより大きくn ^ 2より小さいため、ブルートフォースソリューションよりも優れています。ある場所では、複雑さはn(O(n)+ O(nlogn)= O(n))と見なされ、個人的にはnlognよりも大きいはずだと思います。

2.2アルゴリズムアプリケーション

167 2つの数値の合計II-順序付き配列の入力順序付き配列
ここに写真の説明を挿入
は、コリジョンポインタ方式に非常に適しています


class Solution:
    def twoSum(self, numbers: List[int], target: int) -> List[int]:
        low, high = 0, len(numbers) - 1
        while low < high:
            total = numbers[low] + numbers[high]
            if total == target:
                return [low + 1, high + 1]
            elif total < target:
                low += 1
            else:
                high -= 1

        return [-1, -1]

3.スライディングアレイ

3.1アルゴリズムの紹介

私たちはコンピュータネットワークを研究しましたが、混雑を避けるために、ネットワーク送信中のトラフィックを制御するためのスライディングウィンドウプロトコルがあることは誰もが知っています。このプロトコルにより、送信者は停止して確認を待つ前に複数のデータパケットを送信できます。送信者は、パケットが送信されるたびに停止して確認を待つ必要がないため、このプロトコルはデータ送信を高速化し、ネットワークスループットを向上させることができます。今日お話ししたスライディングウィンドウアルゴリズムが原則です。

スライドウィンドウは、配列/文字列の問題で一般的に使用される抽象的な概念です。ウィンドウは通常、配列/文字列の開始インデックスと終了インデックス、つまり[左、右)(左が閉じている、右が開いている)によって定義される一連の要素のコレクションです。スライドウィンドウは、2つの境界を特定の方向に「スライド」できるウィンドウです。

3.2アルゴリズムアプリケーション

220重複を含むⅢ
ここに写真の説明を挿入

class Solution:
    def containsNearbyDuplicate(self, nums: List[int], k: int) -> bool:
        record = set()
        for i in range(len(nums)):
            if 查找的比v-t大的最小的元素 <= v+t:
                return True
            record.add(nums[i])
            if len(record) == k+1:
                record.remove(nums[i-k])
        return False

4まとめ

検索アルゴリズムは、特定のデータ構造を使用して高速なインデックス作成を実現し、時間と引き換えにスペースを使用できます。一方、同様のバックトラッキング方法を使用して、一定の間隔で要件を満たす部分構造を継続的に検索できますが、部分構造は要件を満たしていません。の場合、境界を調整して次の検索を実行します。

その中でも、コリジョンポインタ方式、バイナリ検索はソートされた配列に適しています。

参照

0.DataWhaleルックアップ
1.ルックアップテーブル
2.コリジョンポインター-一般的な質問タイプ
3.スライディングウィンドウアルゴリズム

おすすめ

転載: blog.csdn.net/hu_hao/article/details/108232111