当前位置: 首页 > news >正文

LeetCode[中等] 80. 删除有序数组中的重复项 II

给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。

不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

 

public class Solution {public int RemoveDuplicates(int[] nums) {int slow = 2, fast = 2;int length = nums.Length;if(length <= 2)return length;while(fast < length){if(nums[fast] != nums[slow - 2]){nums[slow] = nums[fast];slow++;}fast++;}return slow;}
}

复杂度分析

  • 时间复杂度:O(n),其中 n 是数组 nums 的长度。双指针各遍历数组一次。

  • 空间复杂度:O(1)。

More

这道题要求删除数组中重复出现的元素,使每个元素最多出现两次。上述做法可以推广到更普遍的情形,即对于任意 x≥1,删除数组中重复出现的元素,使每个元素最多出现 x 次。

对于普遍的情形,做法是首先判断数组长度是否大于 x,如果数组长度小于等于 x 则返回数组长度,如果数组长度大于 x 则使用双指针。

初始时将快指针 fast 和 slow 都指向下标 x,判断当前元素是否为重复元素时比较 nums[fast] 和 nums[slow−x] 是否相等,其余逻辑不变。时间复杂度和空间复杂度与上述做法相同。

下面的代码为这道题在普遍情形下的实现,取 x=2 的特例。

class Solution {public int removeDuplicates(int[] nums) {return removeDuplicatesAtMostX(nums, 2);}public int removeDuplicatesAtMostX(int[] nums, int x) {int length = nums.length;if (length <= x) {return length;}int fast = x, slow = x;while (fast < length) {if (nums[fast] != nums[slow - x]) {nums[slow] = nums[fast];slow++;}fast++;}return slow;}
}

http://www.lryc.cn/news/467042.html

相关文章:

  • 机器学习5
  • 【Python技术】利用akshare定时获取股票实时价,低于5日线钉钉通知报警
  • LINUX1.2
  • Proximal Distance Algorithm (近段距离算法)
  • 如何判断一个数是几位数与这个数是否为回文数并打印出其逆序数
  • Solon 之 STOMP
  • 在掌控板上搭建http服务器
  • HCIA复习实验
  • 生信软件39 - GATK最佳实践流程重构,提高17倍分析速度的LUSH流程
  • c#编写的各类应用程序、类库的引用(黑白盒)
  • 计算机网络考研笔记
  • 用感性的方式浅要了解什么是AI 与 大模型
  • Linux文件的查找和打包以及压缩
  • 专题十四_哈希表_算法专题详细解答
  • C++源码生成·序章
  • Android中的MVP模式
  • kebuadm部署k8s集群
  • Unity3D学习FPS游戏(2)简单场景、玩家移动控制
  • 网上的 AQS 文章让我很失望
  • 滑动窗口子串
  • 【windows11 提示“Microsoft Visual C++ Runtime Library Runtime Error】
  • 【leetcode|哈希表、动态规划】最长连续序列、最大子数组和
  • 【人工智能】掌握深度学习中的时间序列预测:深入解析RNN与LSTM的工作原理与应用
  • 今日开放!24下软考机考「模拟练习平台」操作指南来啦!
  • 合并.md文档
  • 10月18日笔记(基于系统服务的权限提升)
  • 【STM32 Blue Pill编程实例】-控制步进电机(ULN2003+28BYJ-48)
  • 监督学习、无监督学习、半监督学习、强化学习、迁移学习、集成学习分别是什么对应什么应用场景
  • WSL2 Linux子系统调整存储位置
  • Shiro授权