目次
トピック:
https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/
並べ替えられた配列を指定すると、繰り返される要素を削除して、各要素が1回だけ表示されるようにし、削除された配列の新しい長さを返す必要があります。
余分なスペースの配列を使用しないでください。入力配列の場所を変更し、使用条件O(1)の余分なスペースで完了する必要があります。
例1:
与えられた配列nums = [1,1,2]、
関数は新しい長さ2を返す必要があり、元の配列numsの最初の2つの要素が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]); }
解決策1:ダブルポインター
/**
* 思路:
* 双指针
* 一个记录不重复元素的位置index,一个不断前移
* 只要nums[n]!=nums[n-1]的就将这个元素放到index
*/
public int removeDuplicates(int[] nums) {
int index=1;
for (int i=1;i<nums.length;i++){
if (nums[i]!=nums[i-1]){
nums[index++]=nums[i];
}
}
return index;
}
時間計算量:オン
スペースの複雑さ:O1
解決策2:ダブルポインター
/**
* 思路:
* 双指针
* 一个指向不重复元素位置,一个不断前移
* 比较两个下标的元素值,不等就进行换位
*/
public int removeDuplicates(int[] nums) {
int index=0;
for (int i=1;i<nums.length;i++){
if (nums[i]!=nums[index]){
nums[++index]=nums[i];
}
}
return index+1;
}
時間計算量:オン
スペースの複雑さ:O1