你是不是尝尝因为刷题而苦恼?一道题做懂了过几天再做发现居然做不出来了。别慌,请往下看↓


这里先贴一张力扣原题,删除重复元素2属于1的进阶版。乍一看数组题果断无脑双指针 ,一顿操作猛如虎发现连基础用例都没过。。。斯~还是草率了。
俗话说的话只要思想不滑坡办法总比困难多,我们还是得耐心看问题。首先这里提炼出 2个关键点
1.数组有序且递增
2.删除的步长为≤2,即最多不超过2个重复
这不妥妥的去重吗,直接map干它!!!但是,这里划重点空间复杂度要求常数,所以显然还是不行
我们换种思路,删除操作其实可以抽象出两种状态的数据。我们以状态的视角来看,显然可以分成两种
1.被比对状态的数据,也就是慢指针
2.比对状态的数据,也就是快指针
画个图大概是下面这样↓

那把这个思路向后推广也就是每次我们都比一下快慢指针的数,比完之后发现不同就把快慢指针交换即可。如果从第0个开始显然会把第一个数丢掉。
回过头来看我们每次交换的位置和比对的位置其实并不是一回事,也就是说我们虽然从第0个开始比但是不能从第0个开始交换。
再进一步思考我们发现把交换位置向后偏移一位的话也就是从n开始每次比n-1个数似乎可以解决但是不满足步长为2即2个不重复这个条件。我们发现结果虽然去重了但是保留的是1位。
为什么会这样呢?我们反过头来看我们每次比都是往前推n位,现在取的是1也就是说我们中间是跳过1个元素的,也就是说允许中间n个元素重复。到这里属于直接茅塞顿开了。我们n取2不就可以了!
一试,完美通过~

6507

被折叠的 条评论
为什么被折叠?



