一. 题目描述
二. 思考步骤
- 先采用暴力求解:就是使用两个for循环,一个用于遍历数组的元素并找到需要删除的元素的位置,另一个循环用于覆盖需要删除的元素,即删除一个元素,便将后面的所有元素依次往前面挪一个位置,将原先的元素覆盖掉。
代码示例:
(第一次运行结果出现错误,因为没有考虑到一种情况,那就是当两个需要删除的元素相邻的时候,例如[0,1,2,2,3,0,4,2],删除2,将第三个元素覆盖了以后,原先第四个位置的2又会补充到第三个位置上去了,然而循环会往下进行遍历到第四个位置,这个时候的第四个位置是3,这样就完美错过了,怎么解决这个问题呢?目的就是要将被覆盖的位置重新再检测一遍,由于循环会往后进行,就是i会加1,我们可以设置每当覆盖元素后i减1,使得i不动,实现将被覆盖的位置重新再检测一遍的行为)
成功代码示例:
2. 双指针法:这里我们采用的策略,是用一个快指针来遍历整个数组中需要留下的元素(也就是不需要删除的元素),用一个慢指针作为数组的下标重新为该数组赋值。快指针每遍历一个需要留下的元素,就赋给给慢指针所在的位置,若遇到需要删除的元素,快指针可直接跳过,慢指针依旧不动(因为慢指针只需要留下的元素),快指针则是找到需要留下的元素,而慢指针是将需要留下的元素重新赋值给数组!
代码成功示例:
(注意:若是考虑算法的时间复杂度,暴力方法的平均时间复杂度无疑是o(nn),而双指针法在最坏的情况之下也是o(nn),例如数组中不存在需要删除的元素,两个指针就会都遍历数组一次,等同于两个for循环)