ダブルポインターの問題の概要:
- 要素を削除
numの配列とvalの値が与えられた場合、値がvalに等しいすべての要素を削除し、削除された配列の新しい長さを返す必要があります。
余分な配列スペースを使用しないでください。O(1)の余分なスペースのみを使用して、入力配列をその場で変更する必要があります。
要素の順序は変更できます。新しい長さを超えて配列の要素を考慮する必要はありません。
例1:
nums = [3,2,2,3]、val = 3の場合、
関数は新しい長さ2を返し、nums の最初の2つの要素は両方とも2です。
新しい長さを超えて配列の要素を考慮する必要はありません。
回答:
デュアルポインター:
アイデア
この問題では所定の値のすべての要素を適切に削除する必要があるため、それに対処するにはO(1)O(1)の余分なスペースを使用する必要があります。の解き方?2つのポインターiとjを保持できます。iは低速ポインター、jは高速ポインターです。
アルゴリズム
nums [j]が指定された値と等しい場合、jをインクリメントして要素をスキップします。nums [j]がvalと等しくない限り、nums [j]をnums [i]に割り当て、2つのインデックスを同時にインクリメントします。jが配列の最後に到達し、配列の新しい長さがiになるまで、このプロセスを繰り返します。
class Solution {
public int removeElement(int[] nums, int val) {
int i=0;
for (int j=0; j< nums.length; j++) {
if (nums[j] != val) {
nums[i] = nums[j];
i++;
}
}
return i;
}
}
並べ替えられた配列内の重複するアイテムの削除並べ替えられた配列を指定した場合、繰り返されている要素を削除して、各要素が1回だけ表示されるようにし、削除された配列の新しい長さを返す必要があります。
追加の配列スペースを使用しないでください。入力配列をその場で変更し、O(1)の追加スペースを完成させる必要があります。
例1:
配列nums = [1,1,2]の場合、
関数は新しい長さ2を返し、元の配列numsの最初の2つの要素は1、2に変更されます。
新しい長さを超えて配列の要素を考慮する必要はありません。
回答:
配列がソートされた後、2つのポインターiとjを配置できます。ここで、iは低速ポインター、jは高速ポインターです。nums [i] = nums [j]である限り、jを増やして重複をスキップします。
nums [j] = nums [i]に遭遇すると、重複をスキップする操作が終了したため、その値(nums [j])をnums [i + 1]にコピーする必要があります。次にiをインクリメントし、jが配列の最後に到達するまで同じプロセスを繰り返します。
class Solution {
public int removeDuplicates(int[] nums) {
int i=0;
for (int j=1; j<nums.length; j++) {
if (nums[i] != nums[j]) {
nums[i+1] = nums[j];
i++;
}
}
return i+1;
}
}