Spurs

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

有一个升序排序的数组.

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;
}
posted on 2017-08-28 21:19  英雄与侠义的化身  阅读(112)  评论(0)    收藏  举报