[LeetCode] 80.ソートされた配列IIからの重複の削除

ソートされた配列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          forint 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 };

 

おすすめ

転載: www.cnblogs.com/aaronliu1991/p/12749299.html