LeetCode 26.秩序配列の重複を削除


タイトルの説明
リンク:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array
ソート配列を指定すると、繰り返し表示される要素をその場で削除し、各要素が1回だけ表示されるようにして、削除後の配列の新しい長さを返します.
余分な配列空間を使用しないでください.入力配列をその場で変更し、O(1)余分な空間を使用する条件で完了する必要があります.例1:与えられた配列nums=[1,1,2]では、関数は新しい長さ2を返すべきであり、元の配列numsの最初の2つの要素は1,2に変更される.配列の中で新しい長さの後ろを超える要素を考慮する必要はありません.例2:nums=[0,0,1,1,2,2,3,4]が与えられ、関数は新しい長さ5を返し、元の配列numsの最初の5つの要素は0,1,2,3,4に変更されるべきである.配列の中で新しい長さの後ろを超える要素を考慮する必要はありません.
問題を解く構想.
構想の1つのポインタ+正順遍歴1.ポインタiはリストの開始を指すことを開始する2.下の1からリストを遍歴することを開始し、遍歴要素とポインタの要素が等しくない場合、ポインタ+1は、遍歴要素に移動後のポインタに値を割り当て、両者が等しい場合、ポインタは動かず、遍歴リストを継続する3.遍歴が完了した後、i+1を返し、要素の個数コードを繰り返さない
def solution(nums):
    if not nums:
        return None
    i = 0
    for j in range(1, len(nums)):
        if nums[i] != nums[j]:
            i += 1
            nums[i] = nums[j]
        return i+1

構想2.要素を順方向に削除できない以上、逆方向に遍歴することができる1.リストの末尾から要素を遍歴し、前の項目と比較する2.両者が等しい場合、その位置要素を削除し、等しくない場合は遍歴を続ける3.遍歴が完了した後、リストの長さコードを返すには以下の通りである.
def soultion(nums):
    for i in range(len(nums)-1, 0, -1):
        if nums[i] == nums[i-1]:
            nums.pop(i)
    return len(nums)

構想の3つのポインタ、前のポインタは異なる要素の位置を記録して、後のポインタは異なる要素を探します1.ポインタpとqを初期化して、それぞれリストの0番の要素と1番の要素を指します2.両者が等しいかどうかを判断して、もし待つならば、qは1位を後ろに移動して、等しくなくて、qの指す要素をp+1番の要素に与えて、pとqは同時に1位を後ろに移動します3.qポインタがリストの最後の要素に到着する時、比較を終了し、p+1コードを返します.
if not nums:
    return None
p = 0
q = 0
while q < len(nums):
    if nums[q] == nums[p]:
        q += 1
    else:
        nums[p+1] = nums[q]
        p += 1
        q += 1
return p + 1