# 0026. 删除排序数组中的重复项 ## 题目地址(26. 删除排序数组中的重复项) <https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/description/> ## 题目描述 给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 示例 1: 给定数组 nums = \[1,1,2\], 函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 你不需要考虑数组中超出新长度后面的元素。 示例 2: 给定 nums = \[0,0,1,1,1,2,2,3,3,4\], 函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。 你不需要考虑数组中超出新长度后面的元素。 说明: 为什么返回数值是整数,但输出的答案是数组呢? 请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。 你可以想象内部操作如下: ``` <pre class="calibre18">``` <span class="hljs-title">// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝</span> <span class="hljs-keyword">int</span> len = removeDuplicates(nums); <span class="hljs-title">// 在函数里修改输入数组对于调用者是可见的。</span> <span class="hljs-title">// 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。</span> <span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i = <span class="hljs-params">0</span>; i < len; i++) { print(nums[i]); } ``` ``` ## 前置知识 - [数组](https://github.com/azl397985856/leetcode/blob/master/thinkings/basic-data-structure.md) - 双指针 ## 公司 - 阿里 - 腾讯 - 百度 - 字节 - bloomberg - facebook - microsoft ## 思路 使用快慢指针来记录遍历的坐标。 - 开始时这两个指针都指向第一个数字 - 如果两个指针指的数字相同,则快指针向前走一步 - 如果不同,则两个指针都向前走一步 - 当快指针走完整个数组后,慢指针当前的坐标加 1 就是数组中不同数字的个数 ![](https://img.kancloud.cn/9a/2a/9a2a254606bebf736748acb8212755e5_952x532.gif) (图片来自: <https://github.com/MisterBooo/LeetCodeAnimation>) > 实际上这就是双指针中的快慢指针。在这里快指针是读指针, 慢指针是写指针。 ## 关键点解析 - 双指针 这道题如果不要求,O(n) 的时间复杂度, O(1) 的空间复杂度的话,会很简单。 但是这道题是要求的,这种题的思路一般都是采用双指针 - 如果是数据是无序的,就不可以用这种方式了,从这里也可以看出排序在算法中的基础性和重要性。 - 注意 nums 为空时的边界条件。 ## 代码 - 语言支持:JS,Python,C++ Javascript Code: ``` <pre class="calibre18">``` <span class="hljs-title">/** * @param {number[]} nums * @return {number} */</span> <span class="hljs-keyword">var</span> removeDuplicates = <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">nums</span>) </span>{ <span class="hljs-keyword">const</span> size = nums.length; <span class="hljs-keyword">if</span> (size == <span class="hljs-params">0</span>) <span class="hljs-keyword">return</span> <span class="hljs-params">0</span>; <span class="hljs-keyword">let</span> slowP = <span class="hljs-params">0</span>; <span class="hljs-keyword">for</span> (<span class="hljs-keyword">let</span> fastP = <span class="hljs-params">0</span>; fastP < size; fastP++) { <span class="hljs-keyword">if</span> (nums[fastP] !== nums[slowP]) { slowP++; nums[slowP] = nums[fastP]; } } <span class="hljs-keyword">return</span> slowP + <span class="hljs-params">1</span>; }; ``` ``` Python Code: ``` <pre class="calibre18">``` <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Solution</span>:</span> <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">removeDuplicates</span><span class="hljs-params">(self, nums: List[int])</span> -> int:</span> <span class="hljs-keyword">if</span> nums: slow = <span class="hljs-params">0</span> <span class="hljs-keyword">for</span> fast <span class="hljs-keyword">in</span> range(<span class="hljs-params">1</span>, len(nums)): <span class="hljs-keyword">if</span> nums[fast] != nums[slow]: slow += <span class="hljs-params">1</span> nums[slow] = nums[fast] <span class="hljs-keyword">return</span> slow + <span class="hljs-params">1</span> <span class="hljs-keyword">else</span>: <span class="hljs-keyword">return</span> <span class="hljs-params">0</span> ``` ``` C++ Code: ``` <pre class="calibre18">``` <span class="hljs-keyword">class</span> Solution { <span class="hljs-keyword">public</span>: <span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">removeDuplicates</span><span class="hljs-params">(<span class="hljs-params">vector</span><<span class="hljs-keyword">int</span>>& nums)</span> </span>{ <span class="hljs-keyword">if</span>(nums.empty()) <span class="hljs-keyword">return</span> <span class="hljs-params">0</span>; <span class="hljs-keyword">int</span> fast,slow; fast=slow=<span class="hljs-params">0</span>; <span class="hljs-keyword">while</span>(fast!=nums.size()){ <span class="hljs-keyword">if</span>(nums[fast]==nums[slow]) fast++; <span class="hljs-keyword">else</span> { slow++; nums[slow]=nums[fast]; fast++; } } <span class="hljs-keyword">return</span> slow+<span class="hljs-params">1</span>; } }; ``` ``` **复杂度分析** - 时间复杂度:O(N)O(N)O(N) - 空间复杂度:O(1)O(1)O(1) 更多题解可以访问我的 LeetCode 题解仓库:<https://github.com/azl397985856/leetcode> 。 目前已经 37K star 啦。 关注公众号力扣加加,努力用清晰直白的语言还原解题思路,并且有大量图解,手把手教你识别套路,高效刷题。 ![](https://img.kancloud.cn/a3/63/a363818092b0356fbd67882f0389528b_900x500.jpg)