class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if (nums.size() == 0)
return 0;
int res = 1;
int index = nextDifferentCharacterIndex(nums, 1);
int i = 1;
while (index < nums.size()) {
res++;
nums[i++] = nums[index];
index = nextDifferentCharacterIndex(nums, index + 1);
}
return res;
}
private:
int nextDifferentCharacterIndex(const vector<int> &nums, int p) {
for (; p < nums.size(); p++)
if (nums[p] != nums[p - 1])
break;
return p;
}
};
//************************************************************
// 完整程序
//************************************************************
/// Source : https://leetcode.com/problems/remove-duplicates-from-sorted-array/
/// Author : liuyubobobo
/// Time : 2016-12-06
//#include <iostream>
//#include <vector>
//#include <cassert>
//#include <stdexcept>
//using namespace std;
/ Two pointers
/ Time Complexity: O(n)
/ Space Complexity: O(1)
//class Solution {
//public:
// int removeDuplicates(vector<int>& nums) {
// if (nums.size() == 0)
// return 0;
// int res = 1; //初始被保存下来的个数是1,后面被保存的数可能逐渐增加
// int index = nextDifferentCharacterIndex(nums, 1); //初始使用 nextDifferentCharacterIndex 的函数输入值要从第二个数即 角标=1 开始
// //这是 index 的初始化,方法很不错
// int i = 1; //i从1开始,
// while (index < nums.size()) {
// res++; //如果上面的循环开始,意味着第一次 nextDifferentCharacterIndex 返回了值,所以 res++;且nums 的第二数 nums[i++] = nums[index]
// nums[i++] = nums[index]; //这个是重复利用 nums 原有的内存,不用额外开辟新内存
// index = nextDifferentCharacterIndex(nums, index + 1); //每次进入while 循环,传入的 p值 都要用 index+1,不能用 index,因为要进行新一轮的对比 nums[p] != nums[p - 1]
// }
// return res;
// }
私有函数
判定下一个数和当前的数是否相等,如果不相等,就break,且 return p,返回的是最终不相等的那个数的角标
//private:
// int nextDifferentCharacterIndex(const vector<int> &nums, int p) {
// for (; p < nums.size(); p++) //for不需要开始条件, p < nums.size() 是指要从当前数的下一个一直遍历到数组的结尾
// if (nums[p] != nums[p - 1])
// break; //break 只是跳出if 循环而没有跳出函数 nextDifferentCharacterIndex,break后需要 return p
// return p;
// }
//};
//int main() {
// vector<int> nums1 = { 1, 1, 2, 1 };
// cout << Solution().removeDuplicates(nums1) << endl;
// system("pause");
// return 0;
//}