题目描述
思路分析
双 指 针 。 双指针。 双指针。
(l==-1||l==0||!(nums[l]==nums[r]&&nums[l-1]==nums[r]))
这
个
条
件
等
价
于
这个条件等价于
这个条件等价于nums[r]
可
以
放
进
新
数
组
,
解
释
下
:
可以放进新数组,解释下:
可以放进新数组,解释下:
l
=
=
−
1
∣
∣
l
=
=
0
显
然
新
数
组
只
会
有
0
或
1
个
元
素
,
再
加
一
个
元
素
必
然
不
会
有
大
于
两
个
重
复
数
,
l==-1||l==0显然新数组只会有0或1个元素,再加一个元素必然不会有大于两个重复数,
l==−1∣∣l==0显然新数组只会有0或1个元素,再加一个元素必然不会有大于两个重复数,
而
后
边
是
一
个
否
定
,
否
定
的
是
重
复
的
情
况
,
也
即
l
和
l
−
1
位
置
的
数
=
=
r
位
置
的
数
而后边是一个否定,否定的是重复的情况,也即l和l-1位置的数==r位置的数
而后边是一个否定,否定的是重复的情况,也即l和l−1位置的数==r位置的数
空
间
优
化
为
空间优化为
空间优化为O(1)
是
滚
动
数
组
思
想
:
用
后
边
的
覆
盖
前
边
的
。
是滚动数组思想:用后边的覆盖前边的。
是滚动数组思想:用后边的覆盖前边的。
代码实现
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int ans=0,r=0,l=-1;
while(r<nums.size()){
if(l==-1||l==0||!(nums[l]==nums[r]&&nums[l-1]==nums[r])){
nums[++l]=nums[r];
}
r++;
}
return l+1;
}
};