做国际网站要多少钱,公司网站模版 dedecms,网站后台被百度蜘蛛抓取,学做网站论坛vip账户文章目录 写在前面Tag题目解读题目来源解题思路方法一#xff1a;原地操作 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法#xff0c;两到三天更新一篇文章#xff0c;欢迎催更…… 专栏内容以分析题目为主#xff0c;并附带一些对于本题涉及到的数据结构等… 文章目录 写在前面Tag题目解读题目来源解题思路方法一原地操作 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法两到三天更新一篇文章欢迎催更…… 专栏内容以分析题目为主并附带一些对于本题涉及到的数据结构等内容进行回顾与总结文章结构大致如下部分内容会有增删 Tag介绍本题牵涉到的知识点、数据结构题目来源贴上题目的链接方便大家查找题目并完成练习题目解读复述题目确保自己真的理解题目意思并强调一些题目重点信息解题思路介绍一些解题思路每种解题思路包括思路讲解、实现代码以及复杂度分析知识回忆针对今天介绍的题目中的重点内容、数据结构进行回顾总结。 Tag
【原地操作】【双指针】【数组】 题目解读
给你一个有序数组 nums请你进行【原地操作】移除数组中的元素使得每个元素出现的次数不得超过 2。返回移除后新数组的长度。 题目来源
面试经典 150 题 —— 80. 删除有序数组中的重复项 II 解题思路
方法一原地操作
【原地操作】移除多余的元素首先应该想到 “覆盖” 操作即利用一些数来覆盖掉多余的元素。
由于只允许每个元素最多出现两次因此数组的前两个元素不用考虑如果数组的长度 2直接返回原数组的长度即可。
现在开始讨论更一般的即数组长度大于 2 的情况。因为数组是排好序的所以重复的数字一定在相邻的位置。我们使用双指针来解决这个问题slow 指针指向无重复数字放置的位置也表示已经处理好的数组长度fast 指针指向每一个将要处理的数字。我们利用指针 fast 遍历数组检查每一个元素是否应该被保留如果应该被保留将其移动到 slow 处
如果 nums[fast] nums[slow-2]此时必然有 nums[fast] nums[slow-1] nums[slow - 2]说明当前检查的元素有 3 重复的值那么当前检查元素 nums[fast] 不应该被保留否则nums[fast] 应该被保留最后slow 即为处理好的数组的长度。
实现代码
class Solution {
public:int removeDuplicates(vectorint nums) {int n nums.size();if (n 2) {return n;}int slow 2, fast 2;while (fast n) {if (nums[fast] ! nums[slow - 2]) {nums[slow] nums[fast];slow;}fast;}return slow;}
};复杂度分析
时间复杂度 O ( n ) O(n) O(n) n n n 为数组 nums 的长度。
空间复杂度 O ( 1 ) O(1) O(1)因为只使用了两个指针变量属于【原地操作】。 写在最后
如果文章内容有任何错误或者您对文章有任何疑问欢迎私信博主或者在评论区指出 。
如果大家有更优的时间、空间复杂度方法欢迎评论区交流。
最后感谢您的阅读如果感到有所收获的话可以给博主点一个 哦。