一起探索算法的世界:删除排序数组中的重复项(使用双指针)

欢迎来到算法的世界,现在我们在第一层:初级算法。

开始我们的旅途吧!

一起探索算法的世界:删除排序数组中的重复项(使用双指针)

题目

给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。

不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

示例

<code>给定数组 nums = [1,1,2], 

函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。

你不需要考虑数组中超出新长度后面的元素。/<code>
<code>给定 nums = [0,0,1,1,1,2,2,3,3,4],

函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。

你不需要考虑数组中超出新长度后面的元素。/<code>

题解

我们可以看到题目里面声明了,将传入一个数组,我们对数组在原地进行删除,所谓的原地删除,也就是说直接对传进来的int[]进行修改,而不是返回一个新的int[],这也是为什么这道题目的输出不是数组而是一个数组长度。

那么如何进行重复项判断和删除呢?

题目中说明了,这个数组是一个排序数组,也就是说重复项一定是相连的,我们可以通过双指针的方法来进行。一个慢指针i,指向数组没有重复的索引,一个快指针j,不停的往前移动。

当数组[i] = 数组[j]的时候,就代表了数组[j]是一个重复项,此时就跳过j,进入到j+1。

当数组[i] != 数组[j]的时候,就代表了数组[j]不是一个重复项,我们就需要移动i了,把数组[j]的值复制到数组[i+1]上,同时递增i,就实现了,跳过重复项,将不重复项放到正确的位置的操作。

看代码来理解下吧~


一起探索算法的世界:删除排序数组中的重复项(使用双指针)

JAVA代码图

图解

简单画个图看下流程怎么进行的

一起探索算法的世界:删除排序数组中的重复项(使用双指针)


分享到:


相關文章: