题目
给你一个有序数组 nums ,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
思路:创建一个"新"数组的索引变量,while循环遍历,如果当前元素和新下标的元素值一样,我们就认为是重复元素,不做赋值操作。如果当前元素和新下标的元素值不一样,我们就认为是我们要找的元素,就让new_i++,并进行赋值操纵。当然,这里你也可以采用for循环。for循环的话 代码更简洁一点。
public int removeDuplicates(int[] nums) {
// 双指针
// "新"数组的指针
int new_i = 0;
// 原数组的指针 由于第0个元素还没进"新"数组,肯定不一样,所以索引从1开始
int i = 1;
while(i < nums.length){
// 如果当前元素和"新"数组的最后一个元素相同,我们就认为是重复元素
// 重复元素我们需要跳过
if(nums[i] == nums[new_i]){
i++;
}else {
// 如果元素不相同,我们就把这个元素装到"新"数组中
new_i++;
nums[new_i] = nums[i];
}
}
// 由于返回的是数组长度,所以最后要+1
return new_i+1;
}
时间复杂度O(n)