LeetCode官方题解:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/solution/shan-chu-pai-xu-shu-zu-zhong-de-zhong-fu-xiang-by-/
目录
一、需求
A:给定排序数组,原地删除重复出现的元素,即每个元素只出现一次;
B:返回移除元素后数组的新长度;
C:要求不能使用额外的数组空间,额外空间为O(1);
二、双指针法
-
思路分析
A:定义下标i来保存不重复的元素,定义下标j是为了寻找不重复的元素;
B:首先第一个元素与第二个元素比较,相等说明这两个值相等,即重复了,因为j是为了寻找不重复
的元素,所以j要继续增加,而i不变;
C:找到与第一个元素不重复的元素后,因为下标i是来保存不重复的元素的,此时要i++,然后保存该
不重复元素;
D:以[1,1,2,2,2,3]为例
a:nums[0]与nums[1]比较,相等,此是下标j为1,它要继续向后找到和nums[0]不一样的值;
b:j=2时,nums[0]!=nums[2],那么利用i使得nums[1]=nums[2],相当于把不重复元素移动到了
nums[0]的后面,此时数组为[1,2,2,2,2,3];
c:继续查找与nums[1]不重复的元素,找到了nums[5],于是令nums[2]=3,这就相当于在nums[1]
后面又加入了不重复元素;
d:i代表的是不重复元素的下标是2,不重复的元素个数为3,新数组的长度即为3,数组中超过新长度
后面的元素无需考虑;
-
代码实现
class Solution {
public 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;
}
}
-
复杂度分析
A:时间复杂度O(n);
B:空间复杂度O(1);