思路:定义三个变量 des begin next 其中 des 和 bigin 从0开始 next从1开始
上述思路的代码:
int removeDuplicates(int* nums, int numsSize){
int cur=0,next=1,begin=0;
while(next<numsSize)
{
while(next<numsSize&&nums[begin]==nums[next])
{
next++; // 有相同的数就让next往后移动 直到找到不同的那个数
}
nums[cur]=nums[begin];//把那些相同的数取最开始的那个数赋值给数组的第一个元素 然后让cur加加 成为第二个元素下标 继续进行找重
begin=next;
cur++;//找完一个重复的元素就让cur 加加 实现把数组中的数无重复的从头到尾排列 在原数组中国进行赋值操作 不用开辟新空间 减小了空间复杂度
next++;
}
if(next==numsSize)
nums[cur++]=nums[begin];
return cur;
}
拓:但是我开始是以下面这种思路做的 似乎更优
思路:直接找相同的元素 找到了就直接让des往后挪 next赋值给begin 这时next和begin对应下标的元素肯定是与上一个元素不同的 那么就直接把它赋值给des对应的下标 这样就保证了不会漏掉数组中的元素了 最后如果next越界的话让其减减一下就是去重后元素的个数了 直接return next(或者 return des+1;也可以),这种方法可以一样达到上面的效果 我觉得还是我的这种方法妙!
int removeDuplicates(int* nums, int numsSize){
if(numsSize==1)
return 1;
int des = 0, next = 1, begin = 0;
while (next < numsSize)
{
while (nums[begin] == nums[next])
{
next++;
if (next == numsSize)
{
next--;
// return des+1;
return next;
}
}
des++;
begin = next;
nums[des] = nums[begin];
}
return des;
}