ソートされた配列IIの重複を削除します。並べ替えられた配列が与えられた場合、繰り返される要素を削除して、各要素が最大で2回表示されるようにし、削除後に配列の新しい長さを返す必要があります。余分な配列スペースを使用しないでください。入力配列を適切に変更し、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。 返される長さを超えて設定される値は問題ではありません。
アイデアはバージョン1に似ていますが、2つの位置から分離する必要があります。最初の無効な位置を指すresポインターを作成します。たとえば、最初の例では、resは最初は3番目のものを指しています。これは、この位置の数値が無効であり、置き換える必要があるためです。タイトルには2回繰り返すことができる要素が必要なため、最初の2つの要素を変更する必要はありません。次に、resが2桁前の数と比較されるたびに、繰り返しがあるかどうかが確認され、繰り返しがない場合は配列に配置されます。
時間O(n)
スペースO(1)
Java実装
1 クラスソリューション{ 2 public int removeDuplicates(int [] nums ){ 3 // コーナーケース 4 if(nums.length <= 2 ) 5 return nums.length; 6 7 // 通常の場合 8 int res = 2 ; 9 for(int i = 2; i <nums.length; i ++ ){ 10 if(nums [i]!= nums [res-2 ]){ 11 nums [res] = nums [i]; 12 res ++ ; 13 } 14 } 15 return res; 16 } 17 }
JavaScriptの実装
1 / * * 2 * @param {数[]} NUMS 3 * @return {数} 4 * / 5 のvar removeDuplicates = 関数(NUMS){ 6 // コーナーケース 7 場合(nums.length <= 2)リターンNUMS .length; 8 9 // 通常の場合 10 let res = 2 ; 11 for(let i = 2; i <nums.length; i ++ ){ 12 if(nums [i]!== nums [res-2 ]){ 13 nums [res] = nums [i]; 14 res ++ ; 15 } 16 } 17 return res; 18 };