leetcode-80:删除有序数组中的重复项II

【中等】力扣算法题解析LeetCode80:删除有序数组中的重复项 II 题目要求原地删除有序数组中重复出现超过两次的元素,保留最多两次重复,返回新长度。使用双指针法:j指针指向新数组写入位置,i指针遍历原数组。比较nums[i]与nums[j-2],若不相等则保留并移动j。时间复杂度O(n),空间复杂度O(1)。例如,输入[1,1,1,2,2,3]处理后返回长度5,数组变为[1,1,2,2,3]。 阅读详情

leetcode 第80题:删除有序数组中的重复项II(原题为26题)
要求:
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。

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

示例:

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

我写的版本:通过一个 flag 计数,记录重复元素数量超过2的

public static int removeDuplicates2_2(int[] nums) {
    if(nums == null || nums.length <= 1 ){
        return nums.length;
    }
    int j = 0;
    int flag = 1;
    for(int i=1; i<nums.length;i++){
        if(nums[j] != nums[i]){
            nums[++j] = nums[i];
            flag=1;
        }else if(nums[j] == nums[i]){
            // 元素如果相等,Flag++
        	// 当 Flag 大于2时就已经达到重复的上限
            flag++;
            if(flag <= 2){
                nums[++j] = nums[i];
            }
        }
    }
    return j+1;  // 作为数组的右边界(开区间),范围为:[0,j+1) 不包括 j+1
}

大佬的版本:巧妙的使用了一个长度为k+1的滑动窗口,每次新元素都会和这个窗口的第一个元素(i-k)位置进行比较,如果新元素不大于窗口的第一个元素,说明重复元素超过了要求的上限。

而窗口的最后一个元素是就是 i 位置,也是当前循环需要操作的位置。

// 改进版本:  将每个元素的重复个数上限扩展为k。
public static int removeDuplicates4(int[] nums,int k){
    int i = 0;
    for (int n : nums)
        // i<k:单个重复项最大为k,无论前k个元素是什么都是满足条件(在序列有序的情况下)。
        if (i < k || n > nums[i-k])
            nums[i++] = n;
    return i;
}
LeetCode 第80题:删除有序数组中的重复项 II 通过上述详细的解析和多种解法的对比,相信大家对LeetCode第80题的解法有了深入的理解。本文介绍了暴力法、双指针法、改进的双指针法和三指针法,每一种方法都有其优缺点。希望大家能够根据具体情况选择合适的解法,并灵活应用到其他类似的数组去重问题中。最后,希望大家在刷题的过程中,不断总结,不断进步。祝大家都能在算法的道路上走得更远! 阅读详情

相关推荐

Autodesk全家桶:从AutoCAD到Maya,设计师必备的7款神器全解析

本文全面解析Autodesk全家桶中的7款设计师必备软件,包括AutoCAD、Revit、Inventor、Fusion 360、Maya和3ds Max等。从二维制图到三维建模,从建筑信息模型(BIM)到影视动画制作,这些工具在工程设计、建筑可视化和数字创意领域展现出强大的协同效应。通过实战案例展示如何整合工作流,显著提升设计效率与项目质量。

weixin_29237635的博客 460

LeetCode80. 删除有序数组中的重复项 II

给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。LeetCode80. 删除有序数组中的重复项 II这道题目其实就是说,数组中如果存在重复元素的话,那么这个元素只能出现两次。像这种原地修改的题目,很容易就想到双指针...

梦想也许遥不可及,但重要的是追梦的过程,用博客记录自己的成长,记录自己一步一步向上攀登的印记 1029

避坑指南:STM32CubeMX配置USB虚拟串口时Heap Size设置的那些坑

本文深入剖析了使用STM32CubeMX配置USB虚拟串口时,因Heap Size设置不当导致设备无法识别的常见问题。文章从故障现象出发,详细解释了堆内存不足如何影响USB枚举过程,并提供了从内存布局分析、动态监控到系统化调试的完整解决方案,帮助开发者从根本上避免这一配置陷阱。

ttt77的博客 599

leetcode每日一题——80.删除有序数组中的重复项II(面试经典150题)

leetcode每日一题——80.删除有序数组中的重复项II(面试经典150题) 内容主要包括对这一题目的思路分析、步骤分析以及代码实现

m0_59800431的博客 1129

FPGA之全数字锁相环(DPLL)

1. 数字锁相环的基本原理和组成 1.1 锁相环(PLL)的简介 锁相环最开始并不是用在数字电路中,而是模拟短路中。对于模拟电路中的锁相环,大家可以参考这篇文章稍微看一下,数字和模拟只是实现的方法不同,但是原理、步骤还是共同的。关于模拟PLL。可以参考一片文章: http://www.sohu.com/a/190569594_464086 首先在学习数字锁相环之前,我们应该先了解什么是锁相环?锁相...

DBLLLLLLLL的博客 5万+

快手极速版抓包实战:安卓/iOS双端获取client_salt全流程解析(避坑指南)

本文详细解析了在安卓和iOS平台上获取快手极速版关键参数`client_salt`的全流程,包括环境配置、抓包工具使用、参数识别与转换等实战技巧。特别针对双端差异和反抓包机制提供了避坑指南,帮助开发者高效安全地完成数据获取任务。

weixin_29021195的博客 714

leetcode-第80题-删除排序数组的重复项 ||

具体地,我们定义两个指针slow和fast分别为慢指针和快指针,其中慢指针表示处理出的数组的长度,快指针表示已经检查过的数组的长度,即nums{fast] 表 示待检查的第一个元素, nums[slow- 1]为上一个应该被保留的元素所移动到的指定位置。nums[slow - 2] = nums[fast]时,当前待检查元素nums[fast]不应该被保留(因为此时必然有 nums[slow- 2] = nums[slow- 1] = nums[fast)。最后,slow 即为处理好的数组的长度。

weixin_48820672的博客 225

SOME/IP协议详解「1.0·概述」

主要讲解什么是someip,

雪云飞星的博客 5367

leetcode:80. 删除有序数组中的重复项 II

为了让解法更具有一般性,我们将原问题的「保留2位」修改为「保留k位」。利用快排双色分区partition思想,O(N),O(1)最后返回有效区的长度即可(validRange+1)举个例子,们令k=2,假设有如下样例。......

OceanStar的博客 1228

从地方政府网站抓取政务公开数据:Python爬虫技术详解

在本文中,我们通过具体实例介绍了如何使用Python编写爬虫,从地方政府门户网站抓取政务公开数据。我们使用了requestsSelenium等最新技术,结合SQLite数据库存储抓取的数据,最后使用matplotlib进行数据可视化分析。通过本项目,您可以掌握如何抓取政府网站的公开数据,并将其进行清洗、存储和分析。这些技术对于进行政府政策分析、公共服务分析等方面具有重要的实际意义。希望通过本文的介绍,您能够更好地理解政务数据抓取的流程和方法,并能在实际工作中运用这些技术进行数据采集和分析。

2201_76125261的博客 1701

YOLO26改进105:全网首发--使用BiFPN改进特征金字塔网络

YOLOv6 v3.0在目标检测领域实现重大突破,通过改进网络架构和训练方案显著提升性能。该版本在COCO数据集上展现出优越表现:YOLOv6-N达到37.5% AP/1187 FPS,YOLOv6-S实现45.0% AP/484 FPS,均超越同类检测器。大模型YOLOv6-M/L分别达到50.0%/52.8% AP,L6版本更创下实时检测新纪录。关键技术包括RepVGGBlock、BiFusion等新型模块,通过多分支融合和高效重参数化设计提升性能。研究团队已验证各改进模块有效性,代码已开源。

AIcurator的博客 95

leetcode 80. 删除有序数组中的重复项 II-java实现

利用了有效数段 最后k的左边都是出现二次和一次的 并且 nums[++k] 赋值为 nums[i]。给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。代码案例:输入:nums = [1,1,1,2,2,3]输出:5, nums = [1,1,2,2,3]

qq_41810415的博客 730

NOTE: When using the `ipython kernel` entry point, Ctrl-C will not work.解决方案

本文主要介绍了NOTE: When using the `ipython kernel` entry point, Ctrl-C will not work.解决方案,希望能对使用jupyter notebook的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 11万+

[力扣LeetCode]80-删除有序数组中的重复项 II

[力扣LeetCode]80-删除有序数组中的重复项 II

JoeyTanHDU的博客 2232

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

LeetCode第80题_删除有序数组中的重复项II

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

qq_40263592的博客 1999

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

leetcode力扣——27.移除元素、26.删除有序数组的重复项、80.删除有序数组中的重复项 II

本文总结了LeetCode上三道关于数组去重的题目解法。27题要求移除指定值元素,使用双指针法遍历数组,将非目标值前移。26题针对有序数组去重,保留单一元素,通过比较当前与前驱元素实现。80题在有序数组中允许元素最多出现两次,通过计数器控制保留次数。三题均采用双指针法实现原地修改,时间复杂度O(n),空间复杂度O(1)。核心思路都是通过维护一个指针来标记有效元素位置,根据不同条件筛选保留元素。

Xiaoyuan_he的博客 848

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

力扣LeetCode第80题 删除有序数组中的重复项 II

函数应返回新长度 length = 7, 并且原数组的前五个元素被修改为 0, 0, 1, 1, 2, 3, 3。函数应返回新长度 length = 5, 并且原数组的前五个元素被修改为 1, 1, 2, 2, 3。给定 nums = [0,0,1,1,1,1,2,3,3],删除重复出现的元素,使得出现次数超过两次的元素。给定 nums = [1,1,1,2,2,3],你不需要考虑数组中超出新长度后面的元素。你不需要考虑数组中超出新长度后面的元素。,返回删除后数组的新长度。

weixin_42823298的博客 861

80. 删除有序数组中的重复项 II【 力扣(LeetCode) 】

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

yyh520025的博客 1543

【LeetCode】80. 删除有序数组中的重复项 II

这篇文章介绍了一个有序数组去重的问题,要求每个元素最多保留两次。文章详细分析了问题本质,提出了双指针算法作为最优解,时间复杂度O(n),空间复杂度O(1)。通过示例说明了算法处理过程,对比了不同方法的优劣,并给出了Go语言实现代码。关键点在于使用快慢指针和计数变量来高效完成原地修改,同时保持数组有序性。

qq_32019341的博客 892

力扣(leetcode)第80题删除有序数组中的重复项 II(Python)

解释:函数应返回新长度 length = 7, 并且原数组的前五个元素被修改为 0, 0, 1, 1, 2, 3, 3。解释:函数应返回新长度 length = 5, 并且原数组的前五个元素被修改为 1, 1, 2, 2, 3。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用。输入:nums = [0,0,1,1,1,1,2,3,3]输出:7, nums = [0,0,1,1,2,3,3]输出:5, nums = [1,1,2,2,3]输入:nums = [1,1,1,2,2,3]

qq_58737789的博客 692

【LeetCode】80.删除有序数组中的重复项II

按照题目中要求,必须在原来数组中进行修改,并且在O(1)额外空间条件下完成。返回数组长度slow。

码农努力学习 538

力扣150题 |80.删除有序数组中的重复项II

解释:函数应返回新长度 length = 7, 并且原数组的前五个元素被修改为 0, 0, 1, 1, 2, 3, 3。解释:函数应返回新长度 length = 5, 并且原数组的前五个元素被修改为 1, 1, 2, 2, 3。给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。第一,nums是升序数组,这说明如果出现重复的元素,那么这些重复的元素一定是连续的,例如。输入:nums = [0,0,1,1,1,1,2,3,3]

方可申不翘二郎腿的博客 584

Python描述 LeetCode 80. 删除有序数组中的重复项 II

给你一个有序数组 ,请你** 原地** 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。说明:为什么返回数值是整数,但输出的答案是数组呢?请注意,输入数组是以**「引用」**方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。你可以想象内部操作如下: 示例 1: 示例 2: 提示:双指针,如果有重复的,保留前两个,然后一直向后走,直到不同的数字...

一起加油 620

力扣 LC80. 删除有序数组中的重复项 II

解释:函数应返回新长度 length = 7, 并且原数组的前七个元素被修改为 0, 0, 1, 1, 2, 3, 3。不需要考虑数组中超出新长度后面的元素。解释:函数应返回新长度 length = 5, 并且原数组的前五个元素被修改为 1, 1, 2, 2, 3。给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。输入:nums = [0,0,1,1,1,1,2,3,3]输出:7, nums = [0,0,1,1,2,3,3]

342

力扣(LeetCode)面试150 |80. 删除有序数组中的重复项 II

题目要求从有序数组中原地删除重复元素,保留最多两个相同值。解题思路是使用双指针法:慢指针k标记有效位置,快指针遍历数组。关键判断条件是当前元素是否与nums[k-2]相同 - 若相同说明已有两个重复,跳过;否则保留。算法时间复杂度O(n),空间复杂度O(1)。与LeetCode第26题类似,但允许最多保留两个重复项。示例:[1,1,1,2,2,3]处理后变为[1,1,2,2,3],返回长度5。

m0_68575652的博客 364

Java算法-力扣leetcode-80. 删除有序数组中的重复项 II

Java算法-力扣leetcode-80. 删除有序数组中的重复项 II 给你一个有序数组nums,请你删除重复出现的元素,使得出现次数超过两次的元素,返回删除后数组的新长度。不要使用额外的数组空间,你必须在并在使用 O(1) 额外空间的条件下完成。为什么返回数值是整数,但输出的答案是数组呢?请注意,输入数组是以**「引用」**方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。

javaphpsqlmysql的博客 566
上一篇: leetcode-26:删除有序数组中的重复项
下一篇: Hadoop学习笔记(一)Hadoop的组成
种花途。
博客等级 码龄10年 3粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值