您的位置:首页 > 其它

leetcode-80-Remove Duplicates from Sorted Array II 顺序表

2016-11-02 09:35 519 查看

问题

题目:[leetcode-80]

思路

本质和25,26一个思路。但是我第一遍没有过。说说我的问题,

不是每次循环都有nums[i-k] = nums[i]的。这样的结果会导致[1,1,1]这样的测试用例过不去,因为output中包含了1这个元素。

所以,整体的逻辑分两部分。

重复元素累加k

非重复元素进行赋值

代码(c++实现)

class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int sz = nums.size();
int k = 0;
map< int, int > mapper;

for( int i = 0; i < sz; ++i )
{
if( mapper.find( nums[i] ) == mapper.end() )
{
mapper[nums[i]] = 1;
nums[i-k] = nums[i];
}
else if( 1 == mapper[ nums[i] ]  )
{
++mapper[nums[i]];
nums[i-k] = nums[i];
}
else
++k;
}

return sz-k;
}
};


上面是第一版的代码,看了看其他人的代码。觉得自己的代码只是解决了问题,但是没有更好的考察问题本省的特性。忽略了Sorted Array这一重要特性。因为元素是有序的,所以本质还是不需要增加一个hashmap的,其实一个变量就够了。

重复元素至多有两个,所以在原数组里面只要nums[i] != nums[i-2]就能保证这个元素不重复。但是,对于下面这组输入则不行。

Input:

[1,1,1,2,2,3]

Output:

[1,1,2,3]

Expected:

[1,1,2,2,3]

原因在于,原数组是会被修改的。所以原数组nums[i-2]的元素,在输出数组中应该是nums[i-2-k]这个元素。

代码1(c++实现)

class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int sz = nums.size();
int k = 0;

for( int i = 2; i < sz; ++i )
{
if( nums[i] != nums[i-2-k] )
nums[i-k] = nums[i];
else
++k;

}
return sz - k;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: