80.ソートされた配列IIから重複を削除 - ミディアム

ソートされた配列を考えると  NUMS、重複削除  インプレース重複が多くて登場するように、  二回に  して、新しい長さを返します。

あなたが入力配列変更することでこれを行う必要があり、別のアレイのための余分なスペースを割り当てない  で、場所を  O(1)余分なメモリで。

例1:

所与NUMS = [1,1,1,2,2,3]、

あなたの関数は、長さ=を返すべきである5の最初の5つの要素と、numsある1, 1, 2, 2それぞれ3。

あなたが返される長さを超えて残すかは重要ではありません。

例2:

所与NUMS = [0,0,1,1,1,1,2,3,3]、

あなたの関数は=長さを返すべき7最初の7つの要素と、numsに変更され  0、0、1、1、2、3及びそれぞれ3。

値が返された長さを超えて設定されているかは重要ではありません。

明確化:

混乱返される値は整数ですが、あなたの答えが配列である理由は?

入力アレイは、入力アレイの変形例も同様に、発信者に知られているであろうことを意味する、参照によって渡されることに注意してください。

内部的には、あなたはこれを考えることができます。

// NUMSは参照によって渡されます。(すなわち、コピーを作成せずに)
int型のlen = removeDuplicates(NUMS)。

//あなたの関数でNUMSへの変更は、呼び出し側が知られているであろう。
//あなたの関数によって返された長さを使用して、それが最初のlen要素を出力します。
{ため(; iはLEN <I ++は、I = 0 INT)
    プリント(NUMS [i])とします。
}

 

二つのポインタを使用します

時間:O(N)スペース:O(1)

クラスソリューション{
     公共 のint removeDuplicates(INT [] NUMS){
         場合(nums.length <= 2 ){
             戻りnums.length。
        } 
        INT遅い= 1、高速= 1 int型 CNT = 1 ;
        一方、(高速< nums.length){
             場合(NUMS [速い- 1 [高速] = NUMS!]){ 
                CNT = 1 
                NUMS [遅い ++] =のNUMS [速い++ ]; 
            } {
                 場合(CNT <2){ 
                    NUMSは[遅く =のNUMS ++]を[高速++ ]。
                    CNT ++ ; 
                } { 
                    速い ++ 
                } 
            } 
        } 
        戻り遅いです。
    } 
}

 

おすすめ

転載: www.cnblogs.com/fatttcat/p/11331368.html