删除有序数组的重复项(力扣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; }