给一个非严格递增排列的数组ums,原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。元素的相对顺序应该保持一致。然后返回 nums中唯一元素的个数。考虑nums的唯一元素的数量为k。去重后,返回唯一元素的数量k。nums的前k个元素应包含排序后的唯一数字。下标k-1之后的剩余元素可以忽略。
int removeDuplicates(int* nums, int numsSize) {
if (numsSize == 0) {
return 0;
}
int i = 0;
for (int j = 1; j < numsSize; j++) {
if (nums[j] != nums[i]) {
i++;
nums[i] = nums[j];
}
}
return i + 1;
}
思路:运用两个指针,快指针j找新元素,慢指针i守位置,找到新元素就放到慢指针的下一个空位,最后慢指针 + 1 就是去重后的长度。如果数组是空的,直接返回0;不为空就先初始化指针,让i=0,j=1从第二个元素开始找;然后循环遍历,j从1走到数组末尾,找与nums[i]不同的元素。当nums[j] != nums[i]时,i向后移一位,将nums[j]赋值给nums[i]。遍历结束后,i+1去重后的长度。
重要知识点:
(1)双指针适用场景:移除重复元素;数组有序,找两个数的和等于目标值;反转数组、链表;找到数组中第K大的元素 (2)考虑特殊情况。先判断数组是否为空,避免代码出错。 (3)数组必须有序