毎日書かれたテストleetCode 26.ソートされた配列の重複を削除する
leetCode 26.ソートされた配列の重複を削除する
並べ替えられた配列が与えられた場合、繰り返されている要素を削除して、各要素が一度だけ表示されるようにし、削除された配列の新しい長さを返す必要があります。
追加の配列スペースを使用しないでください。入力配列をその場で変更し、O(1)の追加スペースを完成させる必要があります。
例1:
与えられた配列nums = [1,1,2]、
関数は新しい長さ2を返す必要があり、元の配列numsの最初の2つの要素は1、2に変更されています。
新しい長さを超えて配列の要素を考慮する必要はありません。
例2:
与えられた数値= [0,0,1,1,1,2,2,3,3,4]、
この関数は新しい長さの5を返し、元の配列numsの最初の5つの要素が0、1、2、3、4に変更されています。
新しい長さを超えて配列の要素を考慮する必要はありません。
説明:
戻り値が整数であるのに、出力の答えが配列になるのはなぜですか?
入力配列は「参照」によって渡されることに注意してください。これは、関数の入力配列の変更が呼び出し元から見えることを意味します。
次のような内部操作を想像できます。
// numsは「参照」によって渡されます。つまり、実際のパラメータのコピーを作成しないでください
。intlen = removeDuplicates(nums);
//関数の入力配列の変更は、呼び出し元に表示されます。
//関数によって返された長さに従って、その長さの範囲内の配列内のすべての要素を出力します。
for(int i = 0; i <len; i ++){ print(nums [i]); }
メソッド:ダブルポインターメソッド
コードは以下のように表示されます:
package cn.lbl.face.leetCode;
/*
给定数组 nums = [1,1,2],
函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。
你不需要考虑数组中超出新长度后面的元素。
*/
public class 删除排序数组中的重复项2 {
public static void main(String[] args) {
// System.out.println( removeDuplicates(new int[]{1,1,2}));
System.out.println( removeDuplicates(new int[]{
0,0,1,1,1,2,2,3,3,4}));
// System.out.println( removeDuplicates(new int[]{0,0,1,1,1,2,2,3,3,4}));
}
//双指针法
//快慢指针 i(慢) j(快)
public static int removeDuplicates(int[] nums) {
int i=0;
for (int j = 1; j <nums.length ; j++) {
if (nums[i] != nums[j]) {
i++;
nums[i]=nums[j];
}
}
return i+1;
}
}
複雑さの分析
时间复杂度:O(n),假设数组的长度是 n,那么 i 和j 分别最多遍历 n 步。
空间复杂度:O(1)。