解题思路
一层for循环,每次循环通过标记量j确定下一个不等数值要进行赋值的下标(直接覆盖待删除元素)。
时间复杂度:O(n)。
空间复杂度:O(1)。
class Solution {
public int removeDuplicates(int[] nums) {
int j=0;//记录删除的个数==赋值时下标减少的值+1
for(int i=0;i<nums.length;i++){
while(((i+1)<nums.length)&&nums[i]==nums[i+1]){ //注意边界长度
i++;
j++;
}
if((i+1)<nums.length)
nums[i-j+1]=nums[i+1];//每次for循环把下一个不等数值赋过来
}
return nums.length-j;
}
}
参考其它:
有序数组的相邻数值可能重复。删除重复元素即将不重复的元素移到数组的左侧。
用2 个指针,一个在前记作 p,一个在后记作 q。算法流程如下:
public int removeDuplicates(int[] nums) {
if(nums == null || nums.length == 0) return 0;
int p = 0;
int q = 1;
while(q < nums.length){
if(nums[p] != nums[q]){
if(q - p > 1){
nums[p + 1] = nums[q];
}
p++;
}
q++;
}
return p + 1;
}
优化
考虑到数组移动的资源消耗是很大的,在本题中每发现一个新数值后进行一次覆盖赋值的优化方法是非常直接的。