/// Source : https://leetcode.com/problems/remove-duplicates-from-sorted-array-ii/description/
/// Author : liuyubobobo
/// Time : 2016-12-26
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
/// Ad-Hoc
/// Time Complexity: O(n)
/// Space Complexity: O(1)
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int i = 0;
int j = 0;
//当j < nums.size() 可以保证nums[j]不会越界
while (j < nums.size()) {
int k = nextIndex(nums, j); //一开始就返回
int len = min(2, k - j); //使用2作为对比,所以要么是1,要么是2,最多是2。这是天才的做法!
for (int ii = 0; ii < len; ii++)
nums[i + ii] = nums[j]; //新的一组数 角标从j开始的
i += len; //执行完 for 循环之后,重新计算i值,用来作为角标 指导目标数组的存放
j = k; //用来跳出 while 循环
}
return i; //返回最终剩下的数的长度
}
private:
int nextIndex(const vector<int>& nums, int index) {
for (int i = index+1; i < nums.size(); i++)
//for (int i = index; i < nums.size(); i++) //原来写的是 int i = index 但我认为应该写成 int i = index+1 比较好,省去了每一次i++后面的for循环里的自己和自己对比
if (nums[i] != nums[index])
{
return i; //如果不相等,就返回i 否则就返回 nums.size()。 return 是直接从子函数中跳出,break只是从当前循环跳出
}
return nums.size(); //如果最终全部相等,那就 return nums.size()
}
// //私有函数
// //判定下一个数和当前的数是否相等,如果不相等,就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;
// return p;
// }
// };
};
/// Source : https://leetcode.com/problems/remove-duplicates-from-sorted-array-ii/description/
/// Author : liuyubobobo
/// Time : 2016-12-26
// #include <iostream>
// #include <vector>
// #include <algorithm>
// using namespace std;
// /// Ad-Hoc
// /// Time Complexity: O(n)
// /// Space Complexity: O(1)
// class Solution {
// public:
// int removeDuplicates(vector<int>& nums) {
// int i = 0;
// int j = 0;
// //当j < nums.size() 可以保证nums[j]不会越界
// while (j < nums.size()) {
// int k = nextIndex(nums, j); //一开始就返回
// int len = min(2, k - j); //使用2作为对比,所以要么是1,要么是2,最多是2。这是天才的做法!
// for (int ii = 0; ii < len; ii++)
// nums[i + ii] = nums[j]; //新的一组数 角标从j开始的
// i += len; //执行完 for 循环之后,重新计算i值,用来作为角标 指导目标数组的存放
// j = k; //用来跳出 while 循环
// }
// return i; //返回最终剩下的数的长度
// }
// private:
// int nextIndex(const vector<int>& nums, int index) {
// for (int i = index+1; i < nums.size(); i++)
// //for (int i = index; i < nums.size(); i++) //原来写的是 int i = index 但我认为应该写成 int i = index+1 比较好,省去了每一次i++后面的for循环里的自己和自己对比
// if (nums[i] != nums[index])
// {
// return i; //如果不相等,就返回i 否则就返回 nums.size()。 return 是直接从子函数中跳出,break只是从当前循环跳出
// }
// return nums.size(); //如果最终全部相等,那就 return nums.size()
// }
// // //私有函数
// // //判定下一个数和当前的数是否相等,如果不相等,就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;
// // return p;
// // }
// // };
// };
// int main() {
// vector<int> nums1 = { 1, 1, 1, 2, 2, 3 };
// cout << Solution().removeDuplicates(nums1) << endl;
// //下列程序的结论是
// //i++ ++i 后面有 for 循环时,循环中的 i 值都没有变化,并没有被+1
// cout << "pause" << endl;
// vector<int> nums2 = { 1, 2, 3 };
// for (int i = 0; i < nums2.size(); ++i)
// //for (int i = 0; i < nums2.size(); i++)
// {
// cout << nums2[i] << endl;
// }
// system("pause");
// return 0;
// }