Pythonの古典的なデータ構造とアルゴリズムダブルポインター衝突ポインター速度ポインター

ダブルポインター衝突ポインター 

つまり、2つのポインタはそれぞれ頭と尻尾を指し、それらが出会うまで中央に近づき、プログラムは終了し、移動中に特定の規則に従って移動します。

通常、Pythonのデータとしてリストまたは文字列を使用します

たとえば、次のプログラム(ソースGithub、アドレスは一番下)を使用して解決します:( Leetcode 167)アドレス:https://leetcode-cn.com/problems/two-sum-ii-input-array-is -ソート済み/

昇順で配置さ れた順序付き配列が与えられた場合、それらの合計がターゲット数と等しくなるように2つの数を見つけます。

関数は、これら2つの添え字値 index1とindex2を返す必要がありますここで、index1はindex2より小さくなければなりません

問題解決のアイデア:

順序付けられた配列であるため、小さいものから大きいものへと配置されます。

終了合計は中央の値に対応し、ヘッドは後方に増加します。

逆に、尾は前方に移動して小さくなります。

最小の合計はインデックス0と1です。

最大の合計はインデックスn-2n-1であり、nはリストの長さです。

最終状態は頭と尾の衝突です。

class Solution:
    def twoSum(self, numbers: List[int], target: int) -> List[int]:
        if not numbers: return []  #输入列表不存在,返回空值
        start, end = 0, len(numbers)-1  #头尾指针

        while start < end:  #保证尾指针在头指针后边
            _sum = numbers[start] + numbers[end]
            if  _sum < target:  #小于目标值,首指针后移
                start += 1
            elif _sum > target: #大于目标值,尾指针前移
                end -= 1
            else:               #等于目标值,返回结果
                return [start + 1, end + 1]
        return []

ダブルポインタースピードポインター

つまり、ポインタには前後があり、前にあるものが速いポインタで、後ろにあるものが遅いポインタです。

たとえば、次の質問:Leetcode 283  https://leetcode-cn.com/problems/move-zeroes/

配列が与えられた場合、  ゼロ以外の要素の相対的な順序を維持しながら、numsすべて0を配列の最後に移動する関数を記述します 

プログラムのソースはGithubで、アドレスは最低です。

class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        slower, faster = 0, 0 #快指针指向不为零的元素,慢指针指向零元素,满足条件就交换
        while faster < len(nums):
            if nums[slower] != 0:
                slower += 1
            elif nums[faster] != 0:
                nums[slower],  nums[faster] = nums[faster], nums[slower]
                slower += 1
            faster += 1

問題解決のアイデア:

高速ポインタは、ゼロではない要素になるまで、ステップごとに増加します。

遅いポインタがゼロ要素に当たると、それと整列します。

低速ポインタがゼロで高速ポインタがゼロ以外の場合、スワップすると、ポインタが1つインクリメントされます。

終了条件は、高速ポインターが高速で移動するため、高速ポインターが範囲外にあることです。

上記のコードはGithubから提供されており、分析プロセスが記録されています。

参照ソース:https//github.com/lxztju/leetcode-algorithm

おすすめ

転載: blog.csdn.net/li4692625/article/details/109568266