class Solution {
public int removeDuplicates(int[] nums) {
int slow = 0,fast = 0; //起初两个指针指在同一位置
for(fast = 0;fast < nums.length;fast++){ //不管怎样,fast指针始终要向前移动
if(nums[slow] != nums[fast]){ //当fast移动到的数不等于slow所指的数
nums[++slow] = nums[fast]; //将slow先++后再赋值
}
}
return ++slow; //下标+1,如果不加1,返回的就是序号,题目要求返回数组长度
//空间复杂度为O(1),因为申请了两个空间存储变量slow和fast,但这两个都是常量阶的
}
1 2 2 5 6 7 8 |
- 先定义两个指针slow和fast,且两个指针同时指在数组的第一位(看上图)
- fast指针开始++,2!=1,所以slow指针++,然后num[++slow]=num[fast]
- 数组中重复的元素已经去除了,最后要把slow指针++,要不然返回的是数组的下标,而不是长度