问题
思路
本质和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;
}
};