ダブルポインター衝突ポインター
つまり、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つインクリメントされます。
終了条件は、高速ポインターが高速で移動するため、高速ポインターが範囲外にあることです。