記事のディレクトリ
タイトル説明
ソートされた配列を考えると、あなたはそれぞれの要素が削除され、配列の新しい長さを戻した後、一度だけ表示されるように、所定の位置に繰り返し要素を削除する必要があります。
スペースの余分な配列を使用しないでください、あなたがする必要が入力配列の場所を変更し、使用のO(1)余分なスペースの条件の下で完了しました。
例1:
所与のアレイNUMS = [1,1,2]
関数は、2の新しい長さを返す必要があり、元の配列の最初の2つの要素はNUMS 1、2に変更されます。
あなたは、新しい配列の長さの背後の要素を超えて検討する必要がありません。
例2:
与えられたNUMS = [0,0,1,1,1,2,2,3,3,4]、
新しい関数は、長さ5を返す必要があり、元の配列NUMSの最初の5つの要素は0、1、2、3、4に変更されます。
あなたは、新しい配列の長さの背後の要素を超えて検討する必要がありません。
説明:
なぜ、戻り値は整数ですが、答えは、それの出力の配列ですか?
入力アレイは、入力配列を変更することを意味する「参照」モードで渡されることに注意してくださいは、関数内の呼び出し元に表示されてください。
あなたは次のように内部動作があると想像することができます:
// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
int len = removeDuplicates(nums);
// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。
for (int i = 0; i < len; i++) {
print(nums[i]);
}
問題の解決策
フィンガービス(javaの)
アイデア:
public int removeDuplicates(int[] nums) {
if (nums.length == 0) return 0;
int i = 0;
for (int j = 1; j < nums.length; j++) {
if (nums[j] != nums[i]) {
i++;
nums[i] = nums[j];
}
}
return i + 1;
}
複雑性分析
- 時間の複雑さ:O(n)は、
- 宇宙複雑:O(1)