思路一:建立一个队列,首先把A【0】压入队列,从下标为1的位置 扫描数组,如果数字没有和队尾相等就把该数字入队,否则读取下一个数字
然而题目说要常数级别空间复杂度。
思路二: 向这种操作数组的题目,很容易想到双指针操作,我们可以设计快慢指针,当快慢指针指向的位置的数字的元素不同的时候把快指针的值复制到慢指针的前一位,同时fast++,slow++,
如果快慢指针指向的数字的元素相同的时候直接把快指加1读取下一个数字,慢指针不变。
比如
1 1 2 2 3 4 这个数组。设定一慢指针指向a[0],快指针指向a[1]。a[slow] = a[fast],所以fast++,fast = 2,而慢指针不动,仍然是0
a[slow]= 1,a[fast] = 2,两者不等,所以把快指针的值复制到慢指针前一个位置,得到
1 2 2 2 3 4 ,同时slow++,fast++
....剩余一次类推,直到fast = n ,即fast把数组的数字读完了。
此时slow+1即慢指针下标加1就是去重后数组的长度。
思路一代码:
class Solution {
public:
queue<int>q;
int removeDuplicates(int A[], int n) {
if(A == nullptr || n <= 0)
return 0;
q.push (A[0]);
for(int i = 1; i < n; i++)
{
if(q.back() != A[i])//和队尾不等就入队
q.push(A[i]);
else
continue;
}
int len = 0;
while(!q.empty() )//黏贴回原来的数组
{
A[len ++] = q.front();
q.pop();
}
return len;
}
};
思路二代码:
class Solution {
public:
int removeDuplicates(int A[], int n) {
if(A == nullptr || n <= 0)
return 0;
if(n == 1)//只有一个元素不用干了。
return 1;
int slow = 0, fast = slow +1;//快慢指针
while(fast < n)//快指针没有读完数字
{
if(A[slow] == A[fast])//相等就读取下一个数字
fast++;
else
{
A[slow + 1] = A[fast];//不等就黏贴到慢指针前一位。
//快慢指针都向前走一步
slow++;
fast++;
}
}
return slow +1;
}
};