有一个升序排序的数组.
For example,
Given sorted array nums = [1,1,1,2,2,3]
,
Your function should return length = 5
, with the first five elements of nums being 1, 1, 2, 2 and 3
. It doesn't matter what you leave beyond the new length.
元素可重复2次的数组.后面给出了可重复1次的代码,自然的,就有可重复n次的代码.
一开始,我错误理解了本题,以为给出数组长度就行了.本题不仅要给出数组长度,还得把原数组 nums 整理成元素可重复 2 次的数组,虽然不要求返回该数组.
人家想法和代码:
(O(n)) time, (O(1)) extra space.
可重复2次的代码.
int removeDuplicates(vector<int>& A) {
// 边扫描,边修改数组
int i = 0;
for (int n : A) {
if (i < 2 || n > A[i - 2])
A[i++] = n;
}
return i;
}
可重复1次的代码:
int removeDuplicates(vector<int>& A) {
// 边扫描,边修改数组
int i = 0;
for (int n : A) {
if (i < 1 || n > A[i - 1])
A[i++] = n;
}
return i;
}
自己一开始错误理解题意,写的代码:
// 下面是我的不符合题意的代码
// 针对[1,1,1,2,2,3], 可以返回整数5
// 但本题不仅要求返回长度, 还得修改数组.
// 若[1,1,1,1,2,2,3], 则代码就不对了.
int removeDuplicates(vector<int>& A) {
const int n = A.size();
if (n < 3) return n;
int num_item = 2;
for (int i = 2; i < n; i++) {
if (A[i] != A[i - 2])
num_item++;
}
return num_item;
}