C++丨ソートされた配列を指定した場合、各要素が 1 回だけ表示されるように、繰り返される要素をその場で削除し、削除後の配列の新しい長さを返す必要があります。

ソートされた配列を指定した場合、各要素が 1 回だけ表示されるように重複要素を所定の位置で削除し、削除後の配列の新しい長さを返す必要があります。

追加の配列スペースを使用する代わりに、-placeで入力配列を変更し、O(1) の追加スペースを使用して変更する必要があります。

例 1:

配列nums = [1,1,2]の場合、

関数は新しい長さ2を返す必要があり、元の配列numsの最初の 2 つの要素は に変更されます。1,2
新しい長さを超える配列の要素を考慮する必要はありません。

例 2:

与えられたnums = [0,0,1,1,1,2,2,3,3,4]

関数は新しい長さ5 を返す必要があり、元の配列numsの最初の 5 つの要素は次のように変更されます。0,1,2,3,4
新しい長さを超える配列内の要素を考慮する必要はありません。

例証します:

戻り値が整数であるのに、出力される答えは配列であるのはなぜですか?

入力配列は「参照によって」渡されることに注意してください。これは、関数内の入力配列への変更が呼び出し元に表示されることを意味します。

 

アイデア:

ダブルポインタ方式を使用します。最初は i=0、j=1、次に j を移動し、nums[i] == nums[j] を判断します。nums[i] が nums[j] と等しくない場合は、nums の値を変更します。 [j] それを i の次のビットに代入すると、i は 1 ずつ増加します (ここで i++ と ++i の違いに注意してください)。

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int i=0;
        int n = nums.size();
        if(n==0) return 0;
        for(int j=1;j<n;j++){
            if(nums[i] != nums[j]) nums[++i] = nums[j];
        }
        return i+1;
    }
};

リコウの提出結果:

実行時間: 32 ミリ秒、ソートされた配列から重複を削除の C++ 提出でユーザーの 96.08% を上回りました

メモリ消費量: 9.8 MB、ソートされた配列からの重複の削除の C++ 送信でユーザーの 87.58% を上回りました

おすすめ

転載: blog.csdn.net/weixin_41209670/article/details/89298537