力扣刷不动?也许是姿势没选对

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

8726d59addd545628ccc812db041eb29.png

80af030fc4974ae08407e075cb095de3.png

这里先贴一张力扣原题,删除重复元素2属于1的进阶版。乍一看数组题果断无脑双指针 ,一顿操作猛如虎发现连基础用例都没过。。。斯~还是草率了。

俗话说的话只要思想不滑坡办法总比困难多,我们还是得耐心看问题。首先这里提炼出 2个关键点

1.数组有序且递增

2.删除的步长为≤2,即最多不超过2个重复

这不妥妥的去重吗,直接map干它!!!但是,这里划重点空间复杂度要求常数,所以显然还是不行

我们换种思路,删除操作其实可以抽象出两种状态的数据。我们以状态的视角来看,显然可以分成两种

1.被比对状态的数据,也就是慢指针

2.比对状态的数据,也就是快指针

画个图大概是下面这样↓

d64ec8e825ce43658d62a393cc08cad8.png

那把这个思路向后推广也就是每次我们都比一下快慢指针的数,比完之后发现不同就把快慢指针交换即可。如果从第0个开始显然会把第一个数丢掉。

回过头来看我们每次交换的位置和比对的位置其实并不是一回事,也就是说我们虽然从第0个开始比但是不能从第0个开始交换。

再进一步思考我们发现把交换位置向后偏移一位的话也就是从n开始每次比n-1个数似乎可以解决但是不满足步长为2即2个不重复这个条件。我们发现结果虽然去重了但是保留的是1位。

为什么会这样呢?我们反过头来看我们每次比都是往前推n位,现在取的是1也就是说我们中间是跳过1个元素的,也就是说允许中间n个元素重复。到这里属于直接茅塞顿开了。我们n取2不就可以了!

一试,完美通过~

d40156c087c0491a810cbb09fcf95732.png

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值