主页 > 互联网  > 

第一期——LeetCode26删除有序数组中的重复项

第一期——LeetCode26删除有序数组中的重复项

查看原题点击这里

题目

给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。

请以下列函数的形式实现操作,numsSize是数组nums的元素个数

int removeDuplicates(int* nums, int numsSize) {

}

示例 1:

输入:nums =[1,1,2] 输出:2,nums=[1,2,_, _] 解释:函数应该返回新的长度2,并且原数组 nums 的前两个元素被修改为 1,2。不需要考虑数组中超出新长度后面的元素。

示例 2:

输入:nums=[0,0,1,1,1,2,2,3,3,4] 输出:5,nums=[0,1,2,3,4] 解释:函数应该返回新的长度5,并且原数组 nums 的前五个元素被修改为0,1,2,3,4 。不需要考虑数组中超出新长度后面的元素。

我们首先会想到建立一个新的数组,把不重复的数字放到新的数组中,但是这样不符合题目空间复杂度为O(1)的要求,所以我们这里提供了一个双指针的方法作为参考。

思路

我们建立第一个指针变量src来遍历数组,同时建立第二个指针变量dst标记被保留下来的元素的位置,

先让dst指向第一个元素,标记第一个元素的位置,src指向dst的后一个元素,如果src指向的元素和dst指向的元素相同,那么src就跳过这个元素检查下一个,dst也不保留这个重复的元素的位置

如果src指向的元素与dst标记的元素不同,那么dst就+1指向数组的下一个位置,并把这个位置改为src指向的这个新的元素

这样重复直到src遍历结束,最后返回新数组的元素个数

最后用代码实现上述操作

代码:(C语言版本) int removeDuplicates(int* nums, int numsSize) { int src=1;//src指向数组第二个元素,下标为1 int dst=0;//dst指向数组的第一个元素,下标为0 while(src<numsSize) { if(nums[src]==nums[dst]) { src++; } else { nums[++dst]=nums[src++]; //将src指向的新的元素赋值给dst当前+1的位置,并src+1查找下一个元素 } } return dst+1; //返回的时新数组的元素个数,dst是数组最后一个元素的下标 }

(持续更新,下期见)

标签:

第一期——LeetCode26删除有序数组中的重复项由讯客互联互联网栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“第一期——LeetCode26删除有序数组中的重复项