int removeDuplicates(int* nums, int numsSize) {
for (int i = 0; i<numsSize; i++)
{
for (int j = i + 1; j<numsSize; j++)
{
if (nums[i] == nums[j]) //遇到重复元素
{
for (int q = j; q<numsSize; q++) //从该元素位置,后一个元素前移
nums[q] = nums[q + 1];
numsSize--; //数组长度减 1
j = i; //关键:在移动元素后,下一个未比较元素仍然是 i + 1,重置 j = i,当次循环结束j++满足下次检索位置
}
}
}
return numsSize;
}
//优秀代码
public int removeDuplicates(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;
}
数组完成排序后,可以放置两个指针 i 和 j,其中i是慢指针,j是快指针
只要num[i]==num[j]就增加 j 以跳过重复项
当num[i]!=num[j]时,重复项以跳过完毕,需要把num[j]的值赋值到num[i+1]里
直到 j 走到数组末尾为止