去除有序数组的重复元素–双指针原地修改

文章目录

  • 去除有序数组的重复元素--双指针原地修改
  • 一、题目描述
  • 二、分析
  • 三、代码:数组
  • 四、代码:链表

一、题目描述

二、分析

  • 显然,由于数组已经排序,所以重复的元素一定连在一起,找出它们并不难,但如果毎找到一个重复元素就立即删除它,就是在数组中间进行删除操作,整个时间复杂度是会达到O(N^2)。而且题目要求我们原地修改,也就是说不能用辅助数组,空间复杂度得是 O(1)。
  • 其实,对于数组相关的算法问题,有一个通用的技巧:要尽量避免在中间删除元素,那我就想先办法把这个元素换到最后去。这样的话,最终待删除的元素都拖在数组尾部,一个一个 pop 掉就行了,每次操作的时间复杂度也就降低到 O(1) 了。
  • 按照这个思路呢,又可以衍生出解决类似需求的通用方式:双指针技巧。具体一点说,应该是快慢指针。
  • 我们 让慢指针 slow 走左后面,快指针 fast 走在前面探路,找到一个不重复的元素就告诉 slow 并让 slow 前进一步。这样当 fast 指针遍历完整个数组 nums 后,nums[0..slow] 就是不重复元素,之后的所有元素都是重复元素

三、代码:数组

int removeDuplicates(int[] nums)
{int n = nums.length;if (n == 0) return 0;int slow = 0, fast = 1;while (fast < n) {if (nums[fast] != nums[slow]) {slow++;// 维护 nums[0..slow] 无重复nums[slow] = nums[fast];}fast++;}// 长度为索引 + 1return slow + 1;
}

四、代码:链表

给你一个有序链表,如何去重呢?其实和数组是一模一样的,唯一的区别是把数组赋值操作变成操作指针而已:

ListNode deleteDuplicates(ListNode head)
{if (head == null) return null;ListNode slow = head, fast = head.next;while (fast != null) {if (fast.val != slow.val) {// nums[slow] = nums[fast];slow.next = fast;// slow++;slow = slow.next;}// fast++fast = fast.next;}// 断开与后面重复元素的连接slow.next = null;return head;
}

去除有序数组/链表的重复元素--双指针原地修改相关推荐

  1. 力扣 26.删除有序数组中的重复元素

    文章目录 题目 思路 AC代码 收获 题目 删除有序数组中的重复元素 思路 快慢指针.快指针不断向前走.判断快指针所指的数与快指针前面的数是否相等,如果相等就说明是重复的,要继续向后移动,如果不相等, ...

  2. java删除有序数组中的重复元素_java去除已排序数组中的重复元素

    题目描述 给定一个已排序的数组,去除数组中的重复元素,只保留一个重复的元素,并且返回新的数组长度. 要求: 不要给数组分配额外的空间,你必须使用常量的内存大小进行原地操作. 例如: 给出数组A=[1, ...

  3. java删除有序数组中的重复元素_算法刷刷刷Leetcode第26题删除排序数组中的重复项...

    给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度.不要使用额外的数组空间,你必须在原地修改输入数组 并在使用 O(1) 额外空间的条件下完成.示例 ...

  4. 每天一道LeetCode-----从有序数组中删除重复元素

    Remove Duplicates from Sorted Array 原题链接Remove Duplicates from Sorted Array 给定一个有序数组,对于数组中的重复项,只需要保留 ...

  5. c语言中删除有序数组中重复元素,去除有序列表中的重复元素

    2014-10-27 09:13:00更新 你仔细研究一下我写的 testAsignPoint 和 testAsignPointAgain 函数就会明白为什么你的二级指针无效了. 还是那句话,你要记住 ...

  6. 每日一题:leetcode80.删除有序数组中的重复元素贰

    题目描述 题目分析 又是一道贴错标签的简单题,很明显的双指针,我的做法是用两个变量保存是否需要记录,官方题解的做法是直接判断,人家的高明一些 class Solution {public:int re ...

  7. 求栈中元素个数算法_Algorithm 大家都会的去除有序数组中重复元素的三种算法...

    问题描述 给定一个有序数组,要删除数组重复出现的元素,使得每个元素之出现一次,然后返回移除重复数组后的新长度: 示例: 给定数组 nums = [1,2,4,4],删除重复出现的元素后,原数组变成 n ...

  8. 14. Leetcode 80. 删除有序数组中的重复项 II (数组-同向双指针-快慢指针)

    给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现两次 ,返回删除后数组的新长度.不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条 ...

  9. 8. Leetcode 26. 删除有序数组中的重复项 (数组-同向双指针-快慢指针)

    给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度.不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件 ...

最新文章

  1. C#在DataTable中使用LINQ
  2. python :re模块基本用法
  3. 各种计算机端口功能,STP各种端口的功能是什么?
  4. redis主从复制和哨兵机制
  5. IBM斥资20亿美元的收购,天气数据为何值钱?
  6. IIS安装时,安装程序无法复制一个或多个文件。特定错误码是0x4b8
  7. golang test测试使用
  8. 基于Tensorflow Object Detection API 的哆啦A梦检测
  9. Word如何删除尾注的横线(Office 2003)
  10. 使用PIE-Engine探寻地球灯光蕴藏的秘密
  11. TPshop电商平台购物车自动化测试
  12. 《麦肯锡工作法》读书分享
  13. 为什么说运维的未来必然是 AIOps?
  14. 求一个数组的非空子集
  15. 新版qq虚拟摄像头颜色不正常_分享 | 在线教学常见问题QQ直播、视频通话、群课堂...
  16. HTML 动态背景
  17. 如何完成计算机的安装程序,如何安装计算机系统程序.doc
  18. 7-1 厘米换算英尺英寸 (15 分)
  19. word文档找不到smartart_教大家word中smartart在哪找
  20. 加解密杂烩程序开发(三)

热门文章

  1. 解决MySQL删除外键时报错Error Code: 1091. Can‘t DROP ‘XXX‘; check that column/key exists
  2. screen常用命令以及screen恢复会话时出现There is no screen to be resumed matching
  3. HID接口设备-硬件要求
  4. (7)Java数据结构--集合map,set,list详解
  5. 如何基于Spark进行用户画像?
  6. hdu5831 Rikka with Parenthesis II
  7. 在Elasticsearch中查询Term Vectors词条向量信息
  8. mongodb清洗数据
  9. Web最基本的弹出窗口代码(javascript)
  10. 蓝桥杯 - 牌型种数(dfs)