Follow up for "Remove Duplicates":
What if duplicates are allowed at most twice?
For example,
Given sorted array A = [1,1,1,2,2,3]
,
Your function should return length = 5
,
and A is now [1,1,2,2,3]
.
解法一:
class Solution {
public:
int removeDuplicates(int A[], int n) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if (n < 3) {
return n;
}
int remove_cnt = 0;
bool first_same = false;
int j = 0;
for (int i = 1; i < n; ++i) {
while (A[j] == A[i] && i < n) {
if (!first_same) {
A[++j] = A[i++];
first_same = true;
} else {
++i;
++remove_cnt;
}
}
if (A[i] != A[j]) {
A[++j] = A[i];
first_same = false;
}
}
return n - remove_cnt;
}
};
解法二:
class Solution {
public:
int removeDuplicates(int A[], int n) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if (n < 3) {
return n;
}
bool first_same = false;
bool has_delete = false;
int i = 0, j = 1;
for (; j < n;) {
if (A[i] == A[j]) {
if (!first_same) {
first_same = true;
if (has_delete) {
A[++i] = A[j++];
} else {
++i;
++j;
}
} else {
++j;
has_delete = true;
}
} else {
if (has_delete) {
A[++i] = A[j++];
} else {
++i;
++j;
}
first_same = false;
}
}
return i + 1;
}
};