题目描述:有序的数组里面移除重复的数字,并返回数组的长度
类似题目还有字符串去重,hash表统计出现次数,详见字符串去重博客
Example 1:
Given nums = [1,1,2],
Your function should return length = 2, with the first two elements of nums being 1 and 2 respectively.
思路:快慢指针,注意这里的指针不是C++的*,而是一种方法
/* 原地去除数组中的重复数字
1快慢指针,一开始快慢指针都指向0
2当两个指针对应数字相同的时候,快指针走一步
3当两个指针对应数字不相同的时候,快指针走一步,慢指针也走一步
4此时,将快指针对应的值交换到慢指针的位置
5 最后新数组的长度就是慢指针+1
因为每次当快慢指针数字不相同的时候,慢指针都会走一步 ,所以不同数字的个数就是慢指针+1,+1因为下标从0开始
*/
#include<iostream>
#include<vector>
using namespace std;
class Solution
{
public:
int removeDuplicates(vector<int> &nums)
{
if(nums.empty())
{
return 0;
}
int fast = 0, slow = 0, n = nums.size();
while(fast < n)
{
if(nums[fast] == nums[slow])
++fast;
else
{
nums[++slow] = nums[fast++];
}
}
return slow+1;
}
};
int main()
{
Solution s;
// vector<int> v {0,0,1,1,1,2,2,3,3,4};
int data;
vector<int> v;
for(int i = 0; i < 10; ++i)
{
cin >> data;
v.push_back(data);
}
int length = s.removeDuplicates(v);
cout << length;
return 0;
}