题目要求:一个有序数组nums,原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。
不可以使用额外的数组空间,必须在原地删除并且额外空间复杂度为O(1)。
重点是双指针算法。
算法思想
使用双指针i和j,在遍历数组时,i首先指向第一个元素,j指向后一个元素,之后对i和j指向的数值进行对比。
如果nums[i] == nums[j]的话,那么增加j来跳过重复项;
如果nums[i] != nums[j]的话,此时将nums[j]的值赋值给nums[i+1],然后递增i。
接着重复相同的过程,直到j到达数组的最后位置。
实现
public class SortedArrayDuplicates {
public static void main(String[] args) {
System.out.println(removeDuplication(new int[] {0,1,2,2,3,3,4}));
}
public static int removeDuplication(int nums[]) {
if(nums.length == 0) {
return 0;
}
int i = 0;
for(int j =1;j < nums.length;j++) {
if(nums[j]!= nums[i]) {
i++;
nums[i] = nums[j];
}
}
return i + 1;
}
}
小结
双指针有很多的应用,代码简单易懂,可以有效的减少时间和空间复杂度。
双指针常见应用