Leetcode删除排序数组中的重复项算法与分析

详解双指针算法 一、双指针算法 ​ 双指针算法是指利用两个指针遍历数组(链表),左右指针相向前进或同向前进,在遍历过程中根据某种限制条件进行筛选,通常可以把时间复杂度降低至O(n)。 二、双指针题目 2.1 leetcode80-删除排序数组中的重复项II 题目描述 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在原地修改输入数... 阅读详情

@Leetcode删除排序数组中的重复项

这是个很经典的入门题,需要你在不开辟新的数组空间的情况下将数组中重复的单元删除并返回数组的新长度,废话少说,让我们来看看题干:

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

示例 1:

给定数组 nums = [1,1,2],
函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。
你不需要考虑数组中超出新长度后面的元素。

示例 2:

给定 nums = [0,0,1,1,1,2,2,3,3,4],
函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。
你不需要考虑数组中超出新长度后面的元素。

说明:
为什么返回数值是整数,但输出的答案是数组呢?
请注意,输入数组是以“引用”方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。
你可以想象内部操作如下:

// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
int len = removeDuplicates(nums);
// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。
for (int i = 0; i < len; i++) {
print(nums[i]);
}

题干真的是很长很啰嗦啊,但是他若不这么说,你肯定会犯不少里面说的禁忌,或者根本不明白为什么要这么做。然而一个好的coder,即使是小白,也要明白为什么题目会这样要求,而不是蒙着头就去完成题目的需求。

那么题目既然要求返回删除重复元素之后的表长,聪明的coder肯定能想到题目的言下之意:算算数组里有多少个互不相同的元素。笔者很蠢,是看了解答之后才知道有这么个投机取巧的方法的。既然有巧方法,那肯定也有笨办法:挨个比较多重循环判断,然后删除、冒泡、删除 、冒泡、删除…于是一个代码小白的心态就这样被自己玩崩了。

我们来看看最容易的方法:

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        if(nums.size()==0)
            return false;
        int cou=1;
        int temp=nums[0];
        for(int i=1;i<nums.size();i++)
        {
            if(nums[i]!=temp)
            {
                temp=nums[i];
                nums[cou]=nums[i];
                cou++;
            }
        }
        return cou; 
    }
};

在这里插入图片描述
方法虽简单,我们还是要把我其中思想和细节。首先必须要做的事情是判断给的数组是不是空数组,如果我没记错,应该第三个测试样例就是一个空数组,如果你的判断条件没写,或者不是写在最开头,换句话说就是进入了数组判断的部分,就会error。

把握本题的关键在于数组是有序的,如果是个无序数组,我们一定要将其排序之后才能进行运算。判断完了空之后我们以第一个元素为基准元素,使他和之后的每个元素进行比较,如果之后的元素与他相同,那就什么都不会发生,要是不同,我们就将这个不同的元素变成基准元素,同时根据已经出现的不同元素的个数,将数组中的代表这个个数的位置的值改变成这个新的基准元素。这样做既保证了统计不同元素的个数,又修改了数组,一举两得。如果你的cou初始化为0,那么你就要改变后面cou++的位置调到数组赋值语句之前,才能使得计算没有偏差。

另外带上一句,还有一种复杂的方法,上面的方法是在判断出不同元素时执行操作,而稍复杂一点的另一种方法则是真实地去掉每一个重复的元素,即将每一个重复的元素利用冒泡排序将其放置到数组的末尾再统一清除,剩下的数组就是答案。这种方法思路十分直接,但是想要代码通过需要注意不少细节问题,考察coder的基本功,笔者在此先不做编写,希望有和笔者一样的小白日后改善之后进行补充!

Java实现删除排序数组中重复元素的方法小结【三种方法比较】 主要介绍了Java实现删除排序数组中重复元素的方法,结合实例形式对比分析了三种常见的数组元素删除算法操作技巧,需要的朋友可以参考下 立即下载

相关推荐

轴承寿命预测实战:手把手教你用IEEE PHM2012数据集训练模型(附Python代码)

本文详细介绍了如何利用IEEE PHM2012数据集构建轴承剩余寿命预测模型,从数据预处理、特征工程到LSTM模型训练与部署,提供了完整的Python代码实现。通过实战案例,帮助读者掌握预测性维护中的关键技术,提升工业设备的运行安全与效率。

weixin_29186249的博客 311

LeetCode每日一题之去除排序数组中的重复项

前言: 大家好,今天是LeetCode每日一题的第三天,给大家分享的是 去除排序数组中的重复项,难度系数一颗星!废话不多数,先上题目! 1.1 题目要求 题目类型: 删除排序数组中的重复项 题目要求: 一个有序数组nums, 原地删除重复出现的元素, 使每个元素只出现一次, 返回删除后数组的新长度 注意事项: 不能使用额外的数组空间, 必须在原地修改输入数组并在使用o(1)额外空间的条件下完成 测试案例: 输入: [0,1,2,2,3,3,4] 输出: 5 重点考查: 双指针算法 1.2

weixin_45301250的博客 294

使用JAVA代码转word文档之动态生成数据填充(图文详解)

今天跟公司对接了业务,根据业务需求,乙方需求文档是word格式的,而我们的数据是动态数据,每生成一份数据,就要以word的形式给乙方一份邮件!这就给了我们的工作一定的难度和挑战! 通过阅读资料,团队的帮助以及自我测试,终于实现了这个功能!因为在搜索资料方面,发现各位博主讲的比较模糊,自己碰到了很多bug,浪费了很多宝贵的时间,所以今天写了这篇文章,希望对自己以后或者他人有所帮助! 操作第一步:先准...

huaiyan 7719

LeetCode-数组篇>从排序数组中删除重复项

写在前面的话,一直想提升自己的算法能力,算法还是蛮有趣的,苦于没有比较好的思路。之前刷知乎看到有人在LeetCode刷题,对自己的算法能力有所提高,所以关注了一波。 本系列是LeetCode刷题篇->数组篇,期望自己能从中获得经验,尽量做到审题仔细,尽量先想出思路,尽量做题前不翻答案和讲解。 从排序数据数组中删除重复项 废话不多说,先贴代码。 题目提供的代码 class Solutio...

Czre的小站~ 296

DySAT+: Enhancing Dynamic Graph Representation Learning with Multi-Head Self-Attention and Temporal-

本文深入探讨了DySAT+模型在动态图表示学习中的创新应用,通过多头时空注意力机制和层级信息融合策略,有效解决了动态图数据中的时间维度信息捕捉和结构演变动态适应问题。该模型在社交网络异常检测和金融交易网络分析等场景中表现出色,显著提升了预测准确率和响应速度。

weixin_29035405的博客 334

卫星测试科普(三):卫星载荷的核心测试设备探秘

总的说来,卫星芯片与元器件,部组件与单机,整机与子系统,系统与整星的设计、定型、制造、验证、总装、发射、在轨等环节都离不开各种测试场景,对于这些卫星测试场景而言,“射频三大件”与高速数字示波器是构成强大测试系统的基础。卫星通信信号生成:覆盖Ka、Q等波段,具备扫频、脉冲、数字调制、噪声信号、雷达信号、数据链信号、OFDM 等多种信号库,用于测试和验证卫星电子设备的电气性能、频率响应、抗干扰能力等。卫星的通信需要高效、快速地传输大量数据,高速信号的质量至关重要,如果卫星信号不佳,卫星就会出现故障或者隐患。

spwbjss的博客 2317

LeetCode—两个数组的交集(排序去重对比+官方两种哈希集合)

两个数组的交集(简单) 2020年6月19日 题目来源:力扣 解题 排序去重对比 看到题目要求,输出结果可以无序,就想到了排序 结果又要求唯一,那么就先去重,这里去重我使用了双指针原地去重 最后就是对比,使用循环对比数值,这里利用了已经排完序的特点,后面的数肯定会越来越大,那后面的数就不用对比前面对比过的数了 class Solution { public int[] intersection(int[] nums1, int[] nums2) { if(nums1==null

学海无涯乐作舟 1561

生信入门第七课:使用FastQC软件进行测序原始fastq数据质控

从实验到数据:RNA定量、文库片段长度、fastqc质控和fastp去接头

微生信 486

LeetCode之从排序数组中删除重复项

给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。 示例 1: 给定数组 nums = [1,1,2], 函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 你不需要考虑数组中超出新长度后面的元素。 示例 2: 给定 ...

学习和工作总结,共勉! 429

MOS 管驱动设计细节,波形分析

一般认为MOSFET是电压驱动的,不需要驱动电流。然而,在MOS的G S两级之间有结电容存在,这个电容会让驱动MOS变的不那么简单。 如果不考虑纹波和EMI等要求的话,MOS管开关速度越快越好,因为开关时间越短,开关损耗越小,而在开关电源中开关损耗占总损耗的很大一部分,因此MOS管驱动电路的好坏直接决定了电源的效率。 对于一个MOS管,如果把GS之间的电压从0拉到管子的开启电压所用的时间越短,那么MOS管开启的速度就会越快。与此类似,如果把MOS管的GS电压从开启电压降到0V的时间越短,那么MOS管关断的

m0_50862404的博客 1万+

镜头像差之五——场曲

什么是场曲? 场曲[curvature of field] 物面上所有的点经过系统后,最佳焦点位置不在同一平面上,若这些像点所成的面为曲面,则称为系统有场曲。 与物高二次方、入射光瞳口径一次方成正比的像差。若仅存在场曲,则所有物平面上的点都有相应的像点,但分布在一个球面上;若采用弯成此种形状的底片,则可获得处处清晰的像。此时在理想像平面上,像点呈现为圆斑。 第一张图是最简单也是最容易理解的场曲,也就是对焦点锐利,其余部分逐渐松散,但实际上大多现代镜头的场曲都呈现为图二的形态:对焦点与边缘锐度.

camerall 1万+

leetcode 26. 删除有序数组中的重复项-java版本

给你一个升序排列的数组nums,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。元素的相对顺序应该保持一致。由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有k个元素,那么nums的前k个元素应该保存最终结果。将最终结果插入nums的前k个位置后返回k。不要使用额外的空间,你必须在原地修改输入数组并在使用O(1)额外空间的条件下完成。判题标准。...

qq_41810415的博客 513

手把手教你学Simulink--单相逆变器模糊逻辑控制策略仿真

本文介绍了在Simulink中设计单相逆变器模糊逻辑控制策略的完整流程。主要包括:1)构建单相逆变器模型;2)使用FuzzyLogicToolbox设计模糊控制器,定义输入输出变量和模糊规则;3)将控制器集成到Simulink模型;4)添加干扰源和示波器;5)配置仿真参数并分析结果。该方法利用模糊控制处理非线性系统的优势,可实现输出电压的精确跟踪,具有良好的鲁棒性。文中提供了详细的步骤说明和示例代码,强调准确设计隶属函数和规则库对控制性能的关键作用。该仿真设计为电力电子控制系统的开发提供了有效支持。

MHD0815的博客 200

LeetCode算法入门 从排序数组中删除重复项 解法与分析

问题描述: 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。 示例 1: 给定数组 nums = [1,1,2], 函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 你不需要考虑数组中超出新长度后面的元素。 示例 ...

Cypress的小屋 194

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

增加数组下标_2020/10/16删除排序数组中都重复项

leetCode题目-删除排序数组中都重复项 给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 示例 1: 给定数组 nums = [1,1,2], 函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 你不需...

weixin_42706667的博客 91

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

算法刻意练习-LeetCode实战02-删去排序数组中的重复项

题目:删除排序数组中的重复项 题目链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/ 看到这道题,第一反映是直接来暴力: class Solution { public: int removeDuplicates(vector<int>& nums) { int...

DZZ18803835618的博客 224

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

LeetCode009: 删除排序数组中的重复项

一、写在前面 LeetCode 第七题 最接近的三数之和 传输门:LeetCode007 : 最接近的三数之和 今天给大家分享的是LeetCode 数组与字符串 第八题:有效的括号,为面试而生,期待你的加入。 二、今日题目 给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。 有效字符串需满足: 1.左括号必须用相同类型的右括号闭合。 2. 左括号必须以正...

简说Python的博客 2288

C# 数据结构与算法:Leetcode同步练习(一)

Leetcode 1:两数之和 public class Solution { public int[] TwoSum(int[] nums, int target) { for(int i=0;i<nums.Length;i++) { for(int j=i+1;j<nums.Length;j++) { if(nums[i]+nums[j]==target)

powerking86的博客 278

leetcode_day02

任务二:删除排序数组中的重复项 原文链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/ 最开始的解决思路:   遍历2次数组;   第一次,遍历整个数组,放置标记index1   第二次,从每一个第一次遍历的元素index1后面开始遍历index2.   然后,一个一个比较,重复的元...

weixin_30535843的博客 427

leetcode-初级算法-1 数组

1. 只出现一次的数字 136 136是题号。以后就不重复了。 一开始的想法是两个指针走两遍,复杂度是o(n^2)。i从头往后走,在每个位置都先假设flag=0,然后让 j 遍历vector一次。当且仅当i!=j && nums[i]=nums[j];时,flag=1.。然后在i的循环里面判断,如果flag==0,就返回nums[i]。 然而超时了。 leetcode的官方解法是利用位运算。 class Solution { public: int singleNumber(ve

AlexAwake的博客 361

Leetcode算法题(九)---------删除排序数组中的重复项

Leetcode算法题(九)---------删除排序数组中的重复项 题目:给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 示例: 给定数组 nums = [1,1,2], 函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 你不需要考虑数组中超出新长度后面的元素 给定 nums = [0,0,1,1,1,2,2,3,3

weixin_39289579的博客 186

真题案例(三):力扣真题训练

在看真题前,我们再重复一遍通用的解题方法论,它可以分为以下 4 个步骤:复杂度分析。估算问题中复杂度的上限和下限。定位问题。根据问题类型,确定采用何种算法思维。数据操作分析。根据增、删、查和数据顺序关系去选择合适的数据结构,利用空间换取时间。编码实现。【题目】 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后的数组和新的长度,你不需要考虑数组中超出新长度后面的元素。要求:空间复杂度为 O(1),即不要使用额外的数组空间。例如,给定数组 nums = [1,1,2],函数应

我乐了的博客 2230

北大硕士LeetCode算法专题课-数组相关问题

北大硕士LeetCode算法专题课-数组相关问题

技术专家 522

TLP-Task05学习笔记

目录023 合并k个升序链表思路实现(咕)026 删除排序数组中的重复项思路Python实现033 搜索旋转排序数组思路实现补充知识链表最大优先队列 本篇为Datawhale组队学习计划第21期LeetCode精选题目组Task05学习笔记。 初学,时间有点仓促,很多解法没有详细分析,未来会修改,见谅。 Datawhale学习文档开源地址: https://github.com/datawhalechina/team-learning-program/tree/master/LeetCodeTencent

cosima0的博客 200

【LeetCode刷题】第一期

【LeetCode刷题】第一期一:1248.统计[优美子数组](中等)二:26.删除排序数组中的重复项(简单)三:1672.最富有客户的资产总量(简单)四:1480.一维数组的动态和(简单)五:1512.好数对的数目 一:1248.统计[优美子数组](中等) 题目描述:传送门 法一:暴力求解 思路:把所有子数组列出来,再遍历一遍,看其中满足条件的有几个 def is_odd(n): return 1 if n%2 == 1 else 0 def odd_num(array): count

Make AI,Not War 338

9.30力扣删除有序数组中的重复项题(出现的问题)

【代码】9.30力扣删除有序数组中的重复项题(出现的问题)

m0_52056778的博客 230
上一篇: Leetcode合并两个有序链表算法与分析
下一篇: Leetcode移除元素算法与分析
Maple_PI
博客等级 码龄7年 3粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值