一、题目

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

不要使用额外的数组空间,必须在原地修改输入数组,并使用 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。

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

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

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

这里不需要考虑数组中超出新长度后面的元素。

二、题解

  • 首先,题目规定了空间复杂度是O(1),对时间复杂度没做要求,当然了,我们解题还是要追求一下更小的时间复杂度,能O(n)就不O(n²),能O(logn)就不O(n)。

  • 其次,题目给出数组已经排好序了,当数组为空或只有1个元素时,肯定没有重复项,直接返回数组长度即可;只有当数组中的元素大于3个,才可能出现重复项。

  • 第三,要修改给定的数组,而不是返回一个新数组,我想到了PHP中的“引用传递”,修改数组中的某个元素,整个数组也会变化。

我首先想到的做法是:遍历数组,将当前元素和下一个元素进行比较,如果相同,就删除当前元素,直到遍历到末尾。代码如下:

function removeDuplicates(&$nums) {
if (count($nums) <= 2) {
return count($nums);
} for ($i = 0; $i < count($nums) - 1; $i++) {
if ($nums[$i] == $nums[$i + 1]) {
unset($nums[$i]);
}
echo count($nums) . "<br>";
}
return count($nums);
}

提交代码未通过。输入的是[0,0,1,1,1,2,2,3,3,4],可输出的是[0,1,2,3,3,4],并没有完成去重。琢磨了一下代码,发现漏洞:既然是引用传递,每 unset 一个元素,都会改变数组的长度,而随着数组长度的缩短,遍历次数也会跟着改变(减少),后面的元素就不再进行比较、删除了。

那就记录遍历时遇到的重复元素,使用两个指针,一快一慢指针,慢指针 i 记录不重复元素,快指针 j 遍历数组,当(nums[i] != nums[j])时,将慢指针右移一位,同时将快指针指向的元素赋值给当前慢指针;当两者相等时则跳过,即双指针法

function removeDuplicates(&$nums) {
if (count($nums) <= 1) {
return count($nums);
} $i = 0;
for ($j = 1; $j < count($nums); $j++) {
if ($nums[$i] == $nums[$j]) {
continue;
}
$i++;
$nums[$i] = $nums[$j];
}
return count(array_slice($nums, 0, $i + 1));
}

LeetCode#26 | Remove Duplicates from Sorted Array 删除有序数组中的重复元素的更多相关文章

  1. 26. Remove Duplicates from Sorted Array(删除排序数组中的重复元素,利用排序的特性,比较大小)

      Given a sorted array, remove the duplicates in-place such that each element appear only once and r ...

  2. [LeetCode]26. Remove Duplicates from Sorted Array删除排序数组中的重复项

    Given a sorted array nums, remove the duplicates in-place such that each element appear only once an ...

  3. [LeetCode] 80. Remove Duplicates from Sorted Array II 有序数组中去除重复项 II

    Given a sorted array nums, remove the duplicates in-place such that duplicates appeared at most twic ...

  4. [LeetCode] 26. Remove Duplicates from Sorted Array ☆(从有序数组中删除重复项)

    [LeetCode] Remove Duplicates from Sorted Array 有序数组中去除重复项 描述 Given a sorted array nums, remove the d ...

  5. [LeetCode] 80. Remove Duplicates from Sorted Array II 有序数组中去除重复项之二

    Given a sorted array nums, remove the duplicates in-place such that duplicates appeared at most twic ...

  6. 【LeetCode】Remove Duplicates from Sorted Array(删除排序数组中的重复项)

    这道题是LeetCode里的第26道题. 题目描述: 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数 ...

  7. [LeetCode] Remove Duplicates from Sorted Array II 有序数组中去除重复项之二

    Follow up for "Remove Duplicates":What if duplicates are allowed at most twice? For exampl ...

  8. lintcode :Remove Duplicates from Sorted Array 删除排序数组中的重复数字

    题目: 删除排序数组中的重复数字 给定一个排序数组,在原数组中删除重复出现的数字,使得每个元素只出现一次,并且返回新的数组的长度. 不要使用额外的数组空间,必须在原地没有额外空间的条件下完成.  样例 ...

  9. 【LeetCode】Remove Duplicates from Sorted List(删除排序链表中的重复元素)

    这道题是LeetCode里的第83道题. 题目描述: 给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次. 示例 1: 输入: 1->1->2 输出: 1->2 示例 2: ...

随机推荐

  1. JSON小记

    json: { "1" : "2", "1" : "3" } 在json中如果有重复的key,会取最后一个key的值,如 ...

  2. 探究Dubbo的拓展机制: 下

    承接上篇, 本篇博文的主题就是认认真真捋一捋, 看一下 Dubbo是如何实现他的IOC / AOP / 以及Dubbo SPI这个拓展点的 总览: 本篇的话总体上分成两部分进行展开 第一点就是 Dub ...

  3. GeneXus 16 如何实现自动化测试和发布

    CI/CD(持续集成/持续发布)是一种软件开发策略,以使公司能够尽可能快速.高效地给客户发布新功能.为了能够实现CI/CD,就需要通过PipeLine对整个软件过程进行一系列的节点管理,必须将每个阶段 ...

  4. Java8 通关攻略

    点赞+收藏 就学会系列,文章收录在 GitHub JavaEgg ,N线互联网开发必备技能兵器谱 Java8早在2014年3月就发布了,还不得全面了解下 本文是用我拙劣的英文和不要脸的这抄抄那抄抄,熬 ...

  5. python文档字符串(函数使用说明)

    关键字: 函数说明.help()函数 1.效果图: 2.代码: # 文档字符串( doc str) 是 函数使用说明 # 用法: 在函数第一行写一个字符串 def fn(*nums): ''' 函数的 ...

  6. APICloud开发者进阶之路 |纯手工编写日程表功能

    本文出自APICloud官方论坛, 感谢论坛版主 赵永亮 的分享. 最近看论坛内关于极光推送的问题有很多, 本想写一个关于极光的详细教程的,无奈已经有很多大牛分享过了,所以只得纯手工写了一个日程表,可 ...

  7. html+css 知识点总结 day1(01-08)

    01  初步认识浏览器 02 浏览器内核 IE   内核:Trident,                 win10 Edge  内核:EdgeHTML Firefox(火狐浏览器)   内核:Ge ...

  8. Pyhon语法字符集报错

    pyhton对语法的字符集,特别的敏感因此我们在写python代码特别要注意.以下代码是个人在学习python中遇见的错误 附:错代码截图1-1 从以上代码中可以看到,似乎代码没有什么问题接下来验证一 ...

  9. python 进程Queue

    1.作用:进程之间的数据交互 2.常用方法 """ 对象.put() 作用:放入队列一个数据 对象.get() 作用:取队列一个数据,若队列没有值,则阻塞 对象.empt ...

  10. ElasticSearch 倒排索引简析

    内容概要 倒排索引是什么?为什么需要倒排索引? 倒排索引是怎么工作的? 1. 倒排索引是什么? 假设有一个交友网站,信息表如下: 美女1:"我要找在上海做 PHP 的哥哥." 需要 ...