您的位置:首页 > 其它

LeetCode 26 remove Duplicate from sorted array

2017-03-12 17:12 302 查看
Given a sorted array, remove the duplicates in place such that each element appear onlyonce and return the new length.

Do not allocate extra space for another array, you must do this in place with constant memory.

For example,

Given input array nums =
[1,1,2]
,

Your function should return length =
2
, with the first two elements ofnums being
1
and
2
respectively. It doesn't matter what you leave beyond the new length.

题意:将有序数组中重复的元素删除,返回新数组元素的长度。注意:数组可能为空

思路:因为是有序的数组,所以只需要遍历一遍,当前迭代器的值和迭代器的下一位置的值做比较就行了。

注意边界条件。因为是和*(ite+1)做比较,所以我们的迭代器不能限制为nums.end(),否则溢出报错。

class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if(!nums.empty())
{
for(auto ite=nums.begin(); ite != nums.end()-1;)
{
if (*ite == *(ite+1))
{
ite = nums.erase(ite);
}
else
{
ite++;
}
}
}
return nums.size();
}
};




看自己的思路消耗的时间也太多了,对比其他人的代码进行了优化。

优化一:

1.首先观察循环是从1开始,是因为该思路是当前元素和前一元素进行的比较,所以进入循环的条件就是数组中的元素个数大于等于2

2..当元素个数为1或者0时,直接返回nums.size() - count

3.两个索引,i为遍历整个数组的索引,count为重复元素计数,当前位置减去重复元素的个数i-count为非重复元素的位置  

class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int count = 0;
for(int i=1;i<nums.size();i++)
{

if(nums[i]==nums[i-1])  //当前元素和前一元素相等,将count往前移动一个位置,有多少个重复元素
count++;
else
nums[i-count]=nums[i];  //当元素不相等时,i-count表示非重复元素的位置
}
return nums.size()-count;
}
};


优化二:

如果优化一较难理解看一下:

1.同样是两个索引,对小于2个元素的数组直接返回.

2.count是从1开始的,因为当元素只有两个时,nums[1]和nums[2]且相等能够正确返回一个元素。

3.count是不重复元素的索引[0...count),当i遍历当前元素和上一元素不重复时,就将当前元素放入count集合内。

class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if(nums.size()<2) return nums.size();
int count = 1;
for(int i=1;i<nums.size();i++)
{

if(nums[i]!=nums[i-1])
nums[count++] = nums[i];
}
return count;
}
};


这三个解法的运行时间:我的思路>优化二>优化一
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: