| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> ??思维导图整理大厂面试高频数组9: 删除重复元素的通解问题 力扣26/80?? -> 正文阅读 |
|
[数据结构与算法]??思维导图整理大厂面试高频数组9: 删除重复元素的通解问题 力扣26/80?? |
题目链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/ https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array-ii/ 0.导图整理1.双指针的快慢指针法上一篇 移除元素 使用的方法就是双指针的快慢指针法, 这个方法使用最重要的点就是 明确快慢指针分别代表的含义, 写代码之前一定要明确两者的具体含义, 再来写代码就比较容易了. 比如在 移除元素 之中, 我们使用的双指针: 右指针right指向当前将要处理的元素, 左指针left指向下一个将要赋值的位置. 其实在本题 删除有序数组的重复项 中, 两个指针的含义和 移除元素 之中的含义是完全相同的: 定义两个指针 fast 和 slow 分别为快指针和慢指针, 快指针表示遍历数组到达的下标位置, 慢指针表示下一个不同元素要填入的下标位置. 在表达上有点差别, 但是本质的思想是完全一致的. 2.和 移除元素 的不同虽然在双指针的使用上, 两者的思想是一致的, 但是具体的使用过程还是有点区别的. 在 移除元素 中, 我们 需要比较的对象 是题目中的给定值, 而且是唯一固定的, 从头到尾都是没有任何变化的. 但是在本题中, 我们 需要比较的对象 不再是某个固定的元素了, 而是 快指针指向位置的前一个元素和当前元素的比较, 因为这样比较, 才能确定两个相邻的元素是否为 重复元素, 从而决定是否要保留当前元素, 这是两题最大的不同点. 还有一个小细节注意下, 因为 移除元素 中被移除的元素可能是任意一个位置的元素, 所以两个指针的下标都是 从0开始 的. 但是在本题中, 数组的第一个元素一定是被保留下来的元素, 所以我们直接从 第二个元素 开始遍历就可以了, 也就是 双指针的下标都是从1开始的. 3.本题的进阶版:每个元素最多出现两次进阶版和原题的唯一区别就是: 并不是要把所有重复元素都删去, 而是允许 每个元素最多出现两次. 改动看似挺简单, 实则是有一定的难度的, 这也直接让本题由 简单 直接提升到 中等 的难度. 如果没有想通此题的变化, 还是比较难处理的, 很多人也有想到用一个count变量来记录每个元素出现的次数, 两次就不处理, 超过两次就进行删除等方法, 但真正实施起来还是有点绕的, 有兴趣的朋友可以自己尝试一下. 我们直接来分析改进后的不同, 也就是进行比较的两个元素变化了. 在原本的题目中, 只需要比较 快指针指向位置的前一个元素和当前元素 即可满足要求, 但是此题明显复杂的多. 首先由于我们并不知道哪些元素会重复多少次, 所以想直接通过快指针指向的元素进行区别是很困难的, 但是这时我们还可以利用慢指针来进行比较. 分析后会发现, 慢指针之前的所有元素都是我们处理好的元素, 也就是 每个元素最多出现两次, 所以如果 当前待检查元素 nums[fast] 和 nums[slow?2] 相同的话, 那么它的出现必然就超过了两次, 因为此时必然有nums[slow?2]=nums[slow?1]=nums[fast], 反正如果不相同, 也就代表 它的出现没有超过两次, 这样我们就找到了 两个需要比较的对象了, 此题也就没什么难点了. 4.本题的通解扩展既然都已经扩展到了 每个元素最多出现两次了, 那么同样可以扩展为 每个元素最多出现k次, 这样就形成了此题的通解问题, 解决了这个问题, 只需把k替换一下, 我们就可以解决任意次数的问题了. 有了两次的经验之后, 其实这个扩展也很容易就理解了, 能够保留的前提是:与当前写入的位置前面的第 k 个元素进行比较,不相同则保留, 也就是直接比较 nums[slow - k] 和 nums[fast] 两个元素即可, 在两次的代码上稍微修改下就能实现了, 这样我们就成功的将这一类问题完美的解决了! 源码Python:
java:
感觉作者写的不错的, 别忘了点赞关注加收藏哦(一键三连)!你的支持会带给我极大的动力, 写出更多优秀文章! 我的更多精彩文章链接, 欢迎查看 各种电脑/软件/生活/音乐/动漫/电影技巧汇总(你肯定能够找到你需要的使用技巧) 力扣算法刷题 根据思维导图整理笔记快速记忆算法重点内容(欢迎和博主一起打卡刷题哦) 计算机专业知识 思维导图整理 最值得收藏的 Python 全部知识点思维导图整理, 附带常用代码/方法/库/数据结构/常见错误/经典思想(持续更新中) 最值得收藏的 C++ 全部知识点思维导图整理(清华大学郑莉版), 东南大学软件工程初试906科目 最值得收藏的 计算机网络 全部知识点思维导图整理(王道考研), 附带经典5层结构中英对照和框架简介 最值得收藏的 算法分析与设计 全部知识点思维导图整理(北大慕课课程) 最值得收藏的 数据结构 全部知识点思维导图整理(王道考研), 附带经典题型整理 最值得收藏的 人工智能导论 全部知识点思维导图整理(王万良慕课课程) 最值得收藏的 数值分析 全部知识点思维导图整理(东北大学慕课课程) 最值得收藏的 数字图像处理 全部知识点思维导图整理(武汉大学慕课课程) 红黑树 一张导图解决红黑树全部插入和删除问题 包含详细操作原理 情况对比 各种常见排序算法的时间/空间复杂度 是否稳定 算法选取的情况 改进 思维导图整理 人工智能课件 算法分析课件 Python课件 数值分析课件 机器学习课件 图像处理课件 考研相关科目 知识点 思维导图整理 考研经验–东南大学软件学院软件工程(这些基础课和专业课的各种坑和复习技巧你应该知道) 东南大学 软件工程 906 数据结构 C++ 历年真题 思维导图整理 最值得收藏的 考研高等数学 全部知识点思维导图整理(张宇, 汤家凤), 附做题技巧/易错点/知识点整理 最值得收藏的 考研线性代数 全部知识点思维导图整理(张宇, 汤家凤), 附带惯用思维/做题技巧/易错点整理 考研思修 知识点 做题技巧 同类比较 重要会议 1800易错题 思维导图整理 考研近代史 知识点 做题技巧 同类比较 重要会议 1800易错题 思维导图整理 考研马原 知识点 做题技巧 同类比较 重要会议 1800易错题 思维导图整理 考研数学课程笔记 考研英语课程笔记 考研英语单词词根词缀记忆 考研政治课程笔记 Python相关技术 知识点 思维导图整理 Numpy常见用法全部OneNote笔记 全部笔记思维导图整理 Pandas常见用法全部OneNote笔记 全部笔记思维导图整理 Matplotlib常见用法全部OneNote笔记 全部笔记思维导图整理 PyTorch常见用法全部OneNote笔记 全部笔记思维导图整理 Scikit-Learn常见用法全部OneNote笔记 全部笔记思维导图整理 Java相关技术/ssm框架全部笔记 科技相关 小米手机 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 0:29:20- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |