解法分析:用双指针的方法解决此问题
用两个指针:
定义两个指针fast 和 slow 分别为快指针和慢指针,快指针表示遍历数组到达的下标位置,慢指针表示下一个不同元素要填入的下标位置,初始时两个指针都指向下标 1。
假设数组的长度是n,将快指针fast 依次遍历从 1 到n−1 的每个位置,判断如果nums[fast]与前一个数字nums[fast-1]不相等,则将nums[fast]的值赋值给nums[slow],slow往右移一位,即slow+1。
遍历结束之后,从nums[0] 到[slow−1] 的每个元素都不相同且包含原数组中的每个不同的元素,因此新的长度即为slow,返回 slow 即可。
此处附上leetcode官方的图片解析便于理解:
1
2
3
4
5
6
7
8
10
11
class Solution {
public int removeDuplicates(int[] nums) {
int a = nums.length;
if (a== 0) {
return 0;
}
int fast = 1, slow = 1;
while (fast < a) {
if (nums[fast] != nums[fast - 1]) {
nums[slow] = nums[fast];
++slow;
}
++fast;
}
return slow;
}
}