龙空技术网

算法图解,面试不用怕:删除排序数组中的重复项(使用双指针)

居家程序员 418

前言:

此刻你们对“java数组中重复”都比较重视,同学们都需要分析一些“java数组中重复”的相关内容。那么小编也在网上网罗了一些关于“java数组中重复””的相关文章,希望兄弟们能喜欢,朋友们快快来学习一下吧!

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

开始我们的旅途吧!

题目

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

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

示例

给定数组 nums = [1,1,2], 函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 你不需要考虑数组中超出新长度后面的元素。
给定 nums = [0,0,1,1,1,2,2,3,3,4],函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。你不需要考虑数组中超出新长度后面的元素。
题解

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

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

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

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

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

看代码来理解下吧~

JAVA代码图

图解

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

标签: #java数组中重复