这个也是使用双指针的方式,但是基于数组。
- 使用两个指针
n
和i
,其中n
用于标记新数组的长度,初始值为0,而i
用于遍历原始数组nums
。 - 从头开始遍历
nums
数组,对于每个元素nums[i]
,进行以下检查:
- 如果
nums[n]
不等于nums[i]
,表示找到了一个新的不重复的元素,将其复制到新数组的下一个位置(nums[++n] = nums[i]
)。 - 如果
nums[n]
等于nums[i]
,表示这是一个重复元素,跳过它。
- 继续遍历整个数组,直到
i
到达数组的末尾。 - 返回
n + 1
的值,这个值表示新数组的长度,其中n
是新数组的最后一个元素的索引,再加1。
这个算法通过只遍历一次数组,将不重复的元素逐个复制到新数组的开头,并保持新数组的长度,实现了从已排序数组中去除重复元素的目的。这是一种高效的方式,因为它只需要一次遍历数组,时间复杂度为 O(n),其中 n 是数组的长度。
举个例子,如果原始数组 nums
为 [1, 1, 2, 2, 2, 3, 4, 4, 5]
,使用这个算法后,新数组会变成 [1, 2, 3, 4, 5]
,同时返回值 n + 1
为 5,表示新数组的长度。
class Solution { public int removeDuplicates(int[] nums) { int n=0; for(int i=0;i<nums.length;i++){ if(nums[n]!=nums[i]){ nums[++n]=nums[i]; } } return n+1; } }