删除有序数组的重复项(力扣26题)【C语言版】

对于刚入算法的我来说,这种初级算法题也花费了我大量的时间去思考。

希望自己能够坚持下去,不从入门到放弃。

加油!

本题的条件

从题目要求中可知有七个约束条件

1,有序数组

2,原地删除重复的元素

3,每个元素出现一次

4,返回删除后数组的新长度,

5,不使用额外的数组空间,

6,原地修改数组,

7,时间复杂度O(1)

这七个条件中,条件7可能对于向我这样的菜鸟来说有点迷茫。

解释一下时间复杂度O(1)就是指不管数据规模有多大,经过一次计算后,就可以得出结果。

(其实经过一次计算实际指一次for或while等)

这道题的示例

 

之所以不需要考虑数组中超出新长度后面的元素,是因为返回长度后数组只输出返回的长度。

题解:

因为不需要考虑数组超出新长度后的元素,则实际不需要删除元素,只需要将不同的元素排列在前面就可以了

1,关键在于设立一个游动哨兵,当发现不同的元素时哨兵就移动下一个不同的元素

2,因为返回的是长度,所以设立一个标签,用于记录长度。

3,标签不仅可以记录长度,还可以通过数组中标签的位置实现将不同的元素放在一起。

 

int removeDuplicates(int* num

int tag=nums[0];
int i,k=1;
if(numsSize==0)
return 0;

for(i=1;i<numsSize;i++)
{
    if(nums[i]!=tag)
    {
        tag=nums[i];
        nums[k]=nums[i];
        k++;
    }
    


}
return k;
}

 

posted @ 2021-10-16 21:34  ccddddddddd  阅读(326)  评论(0编辑  收藏  举报