毎日1つのアルゴリズムの問題--leetcode 26--ソート配列の重複項目を削除--python


【タイトル説明】
【コード構想】
関数のパラメータがlistである場合は参照パラメータを参照し、問題幹はその場で配列を修正しなければならない.問題幹の説明にはremoveDuplicates関数は長さlenを返し、最終的に出力するときは直接印刷前のlen個nums値であることが明記されている.
for (int i=0;iprint(nums[i]);
}

したがってnumsという変数を直接操作し,新しい変数を生成してはならず,O(1)を超える記憶空間を占有してはならない.最初はset関数を直接使うことを考えましたが、set関数を使うとnumsがあるメモリ空間を変えるのではなく、新しい要素セットを生成し、新しいメモリ空間を開き、問題幹で要求される空間複雑度O(1)にも合致しないので、set関数はこの問題では利用できません.従って,ここでは変数jを1つだけ追加し,記憶空間を占有し,空間複雑度はO(1)であった.
全体の構想は二重ポインタであり、iとj,iは1からlist全体を遍歴し、jの初期値は0であり、ループの中でi,jが指す要素を比較し、要素の数値が異なるとjは後ろに1を増やし、nums[i]をnums[j]に与え、最後にj+1を返し、繰り返し要素を含まないnumsの要素長、すなわち前j+1の要素である.
【ソースコード】
class Solution(object):
    def removeDuplicates(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        j=0 
        for i in range(1,len(nums)):
            if nums[i]!=nums[j]:
                j+=1
                nums[j]=nums[i]     
        return j+1