数组部分第二题,和Remove Duplicates from Sorted Array类似:
描述:移除出现超过两次的数组元素
输入:数组,如nums = [1,1,1,2,2,3]
返回:得到返回结果5,即[1,1,2,2,3]五个元素。函数操作过后的数组长度不要求,但前5个必须是1,1,2,2,3。在本例中操作过后的nums为[1,1,2,2,3,3]因为nums[5]=3并没有改动。
本题和上题区别只是这里元素可以重复出现至多两次,而不简单是一次。所以需要维护一个counter,当counter大于2时,就直接跳过即可,否则说明元素出现次数没有超过2,继续放入结果数组,若遇到新元素则重置counter。总体算法只需要扫描一次数组,所以时间上是O(n),空间上只需要维护一个index和counter,所以是O(1)。代码如下:
c++代码:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
// Input: nums = [0,0,1,1,1,1,2,3,3]
// Output: 7, nums = [0,0,1,1,2,3,3,_,_]
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int len = nums.size();
if (len <= 2) {
return len;
}
int cnt = 0;
int j = 0;
for (int i = 1; i < len; i++) {
if (nums[i] == nums[i - 1]) {
cnt += 1;
if (cnt > 1) {
} else {
j += 1;
nums[j] = nums[i];
}
} else {
j += 1;
nums[j] = nums[i];
cnt = 0;
}
}
return j + 1;
}
};
int main() {
vector<int> nums = {0,0,1,1,1,1,2,3,3};
Solution sl;
int res = sl.removeDuplicates(nums);
cout << res << endl;
return 0;
}