方法一:
思路与算法
要删除数组中元素,却不要求改变数据的长度,那么只需要将”不同的元素“前移,由于最后输出结果时,只返回规定长度的数组元素,所以甚至不必”交换“元素,而只是简单地将”不同的元素“复制到”相同的元素“占用的位置即可。
完整代码如下:
class Solution {
public int removeDuplicates(int[] nums) {
// 左指针记录最大不重复元素的下标
int left = 0;
// 右指针从头开始遍历数组,每遇到一个不同的元素
// 就将这个元素的值复制到左指针处,
// 由于是有序数组,所以只需要使用一个左指针记录当前不重复元素的最大值即可,
// 同时将左指针右移。
for (int right = 1; right < len; right++) {
if (nums[right] != nums[left]) {
nums[++left] = nums[right];
}
}
return left + 1;
}
}
复杂度分析
时间复杂度:O(n),其中 n 是数组长度,一次遍历即可。 空间复杂度:O(1),只使用了常数级别的额外空间。
总结
虽然只是一道简单题,但还是暗藏玄机,很巧妙地利用的双指针。