
代码实现:
package datasSouce;
public class SortArrayDuplicate {
public static void main(String[] args) {
System.out.println(removeDup(new int[]{0,1,2,2,2,3,3,4}));
}
private static int removeDup(int[] arr) {
if(arr.length==0){
return 0;
}
//慢指针
int i = 0;
//j位快指针
for (int j = 1; j < arr.length; j++){
//如果相等j就直接往后移,i还是当前位置
if (arr[i] != arr[j]){
//如果不相等则i加一
i++;
//把快指针的值符给i+1
arr[i] = arr[j];
}
}
//返回的是数组下标,所以长度需要加1
return i + 1;
}
}
思路:
- 不能有额外的容器因为空间复杂度位O(1)
- 定义两个快慢指针判断元素的值(i,j)
- 因为数组是有序的所以快慢指针的只需要判断相邻
- i既是慢指针也是返回的长度,因为当相邻的数值相等时i不会加1
- j的数值会赋值给i+1,以便进行连续的判断