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

leetcode经典面试150题---4.删除有序数组中的重复项II

目录

题目描述

前置知识

代码

方法一 双指针

思路

图解

实现

复杂度


题目描述


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

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

示例 1:

输入:nums = [1,1,1,2,2,3]
输出:5, nums = [1,1,2,2,3]
解释:函数应返回新长度 length = 5, 并且原数组的前五个元素被修改为 1, 1, 2, 2, 3。 不需要考虑数组中超出新长度后面的元素。

示例 2:

输入:nums = [0,0,1,1,1,1,2,3,3]
输出:7, nums = [0,0,1,1,2,3,3]
解释:函数应返回新长度 length = 7, 并且原数组的前五个元素被修改为 0, 0, 1, 1, 2, 3, 3。不需要考虑数组中超出新长度后面的元素。

前置知识


  • 双指针

代码


方法一 双指针

思路

  • 首先我们注意到题目要求原地修改,那么肯定就需要一个指针指向当前即将放置元素的位置,需要另外一个指针向后遍历所有元素,所以「双指针」解法就呼之欲出了。
  • 慢指针 slow : 指向当前即将放置元素的位置;则 slow - 1 是刚才已经放置了元素的位置。
  • 快指针 fast : 向后遍历所有元素;
  • 因为最多允许两个重复元素,并且 slow - 2 位置是上上次放置了元素的位置,所以让 nums[fast] 跟 nums[slow - 2] 进行比较。每次都是只允许最多两个元素出现重复,这两个元素的位置在 slow - 1 和 slow - 2

动图

实现

public class Solution {public int removeDuplicates(int[] nums) {int slow = 0;for (int fast = 0; fast < nums.length; fast++) {if (slow < 2 || nums[fast] != nums[slow - 2]) {nums[slow] = nums[fast];slow++;}}return slow;}
}

复杂度

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)
http://www.lryc.cn/news/211650.html

相关文章:

  • Transformer英语-法语机器翻译实例
  • 21.12 Python 实现网站服务器
  • Leetcode.274 H 指数
  • 订单BOM放哪儿?(我的APS项目二)
  • 从0到1之微信小程序快速入门(03)
  • 【面试高高手】—— docker面试题
  • mac电脑怎么永久性彻底删除文件?
  • MySQL(2):环境搭建
  • Android平台GB28181执法记录仪技术方案
  • 【已解决】VSCode运行C#控制台乱码显示
  • MySQL扩展语句和约束条件
  • Java排序学习
  • 《2023中国社交媒体平台指南》丨附下载_三叠云
  • 【unity小技巧】unity排序问题的探究
  • 为什么会被【禅道】工具的公司提出QQ群的反思…………
  • 专业课改革,难度陡然提高,专业课122总分390+南京理工大学818南理工818上岸经验分享
  • Java入门与实践
  • TensorRT量化实战课YOLOv7量化:pytorch_quantization介绍
  • 【23真题】知识点覆盖全!有罕见判断题!
  • K8s外部网络访问之Ingress
  • 中文编程工具免费版下载,中文开发语言工具免费版下载
  • 昂首资本严肃且专业地探讨波浪理论第一波
  • 《论文写作》课程总结
  • 基于SSM的作业提交与查收系统设计与实现
  • Hololens2 报错Microsoft.Windows.System缺少
  • nginx: [emerg] bind() to 0.0.0.0:18888 failed (98: Unknown error)问题解决办法
  • 基于 Redis + Lua 脚本实现分布式锁,确保操作的原子性
  • vue源码分析(七)—— createComponent
  • vue实现图片分页
  • Baklib专注:企业数字内容体验与知识管理