Leetcode-day1【80】删除有序数组中的重复项 II

news2025/1/17 3:11:10

文章目录

  • 80. 删除有序数组中的重复项 II
    • 题目
    • 解题思路
    • 解题思路【学习】
      • 双指针

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

题目

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

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

解题思路

我的思路大致如下,使用三个独立索引(指针)i,j,k,索引i用于指向结果数组末元素的后一位元素,索引j用于指向每个重复段的第一个元素,索引k用于指向每个重复段的后一个元素。所以k-j便是每个重复段中相同元素的个数,通过判断重复次数,移动索引i进行移动赋值(如果次数为1,则赋值一次;次数大于等于2,则赋值两次)。每次移动赋值完成后,j = kk的值赋给j,使j指向下一段的第一个元素。依次类推,直到遍历到倒数第二个重复段。对于最后一个重复段,因为无法找到下一个重复段的首元索引k,所以无法得到最后一个重复段的长度,进而无法判断。所以需要单独计算一下最后一个重复段的长度,单独进行索引i的移动赋值。我的菜鸟解法如下(想了好久www):

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        n = len(nums)
        if n == 0 or n ==1:
            return n
        # nums[0,i]为非重复数列
        i = 0
        j = 0
        k = j + 1
        while k <= n-1:
            if nums[j] != nums[k]:
                if k - j == 1:
                    nums[i] = nums[j]
                    i += 1
                elif k - j >= 2:
                    nums[i] = nums[j]
                    nums[i+1] = nums[j]
                    i += 2
                j = k
            k += 1
        nums[i] = nums[j] 
        if n-1-j >= 1:
            nums[i+1] = nums[j]
            return i+2
        return i+1

解题思路【学习】

双指针

原文链接:【负雪明烛】动画题解,帮助理清思路 - 删除有序数组中的重复项 II - 力扣(LeetCode)

class Solution(object):
    def removeDuplicates(self, nums):
        slow = 0
        for fast in range(len(nums)):
            if slow < 2 or nums[fast] != nums[slow - 2]:
                nums[slow] = nums[fast]
                slow += 1
        return slow

作者:fuxuemingzhu
链接:https://leetcode.cn/problems/remove-duplicates-from-sorted-array-ii/solution/fu-xue-ming-zhu-dong-hua-ti-jie-bang-zhu-yrx5/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

80.gif

看了大佬的题解真是弗如远甚,我只能妙妙妙!特别是nums[fast] != nums[slow - 2]这一段,等式不成立,则说明nums[fast]所指向的元素未重复两次;等式成立,则说明nums[fast]所指向的元素已经重复两次了,巧妙地代替了计数的功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/435361.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CBAM小陈读paper系列

忘记做笔记了&#xff0c;只能 把看文章的PDF保存下来了

神经网络:Zero2Hero 1

Zero → \to → Hero : 1 实现了一个字符级中文语言模型&#xff0c;数据采用的是开源中文姓名数据集中的一部分&#xff0c;主要内容如下&#xff1a; 字符的预处理 统计频次计算字符对频次矩阵 实现一个简单的先验概率模型 从训练数据中计算字符的先验概率根据先验概率通过…

前端UI框架有哪些|20个优秀免费开源的WEB前端UI框架提高网站开发效率

最近准备学习一下前端UI我也是在网上找了很久最终整理出来了20个不错的前端UI框架网站,大家都知道很多成熟的前端框架可以直接引,学习框架可以提升我们网站的开发速度。有些大型公司的前端或者后端框架都是用自己开发的,对于大部分用户和公司来讲,我们可以用开源免费的前端…

TCP和UDP通信对比

tcp通信流程 服务器: 创建流式套接字 绑定 监听 提取 读写 关闭 客户端: 创建流式套接字 连接 读写 关闭 收发数据: read recv ssize_t recv(int sockfd, void *buf, size_t len, int flags); //flagsMSG_PEEK 读数据不会删除缓冲区的数据 write send ssize_t send(int…

【Paper Note】ViViT: A Video Vision Transformer

ViViT: A Video Vision Transformer AbstractOverview of vision transformer 回顾ViTEmbedding video clips 视频编码方式Uniform frame sampling 均匀采样Tubelet embedding 时空管采样初始化3D卷积代码介绍视频编码输入到模型当中 Transformer Models for VideoSpatio-tempo…

安全测试(linux基线排查)看这一篇就够了

前言部分&#xff1a; 作为一个安全测试人员&#xff0c;在确保WEB应用程序没有漏洞外&#xff0c;应该也需要关注一下主机环境的安全&#xff0c;因为应用程序部署在主机环境提供运行环境&#xff0c;也应当关注一下主机环境的安全。于此&#xff0c;通过学习本次对linux安全加…

香橙派pi5下,debian,docker19.03.9版本runc容器逃逸

在香橙派pi5下,debian,docker19.03.9版本下,安装系统后,启动docker,显示一切正常。 当加入k8s集群以后,可以正常连接到集群,node状态显示为ready。看起来一切正常。不过过一会之后,香橙派节点内存飙升,然后挂掉。重连失败,需要重启后才能重连。且swapoff -a命令执行…

C++之深入解析C++20协程的原理和应用

一、无栈协程成为 C20 协程标准 协程分为无栈协程和有栈协程两种&#xff0c;无栈指可挂起/恢复的函数&#xff0c;有栈协程则相当于用户态线程。有栈协程切换的成本是用户态线程切换的成本&#xff0c;而无栈协程切换的成本则相当于函数调用的成本&#xff1b;无栈协程和线程…

个人写校园点评项目的笔记

目录 ​编辑 1.解决短信登陆--2023.4.14 redis 数据类型 阿里云短信服务 存入redis的key和value 流程 dto的意义 给token设置有效期 拦截器的类没有交给Spring Constants 2.商户查询缓存&#xff08;不采用SpringCache&#xff0c;而是尝试原理实现&#xff09; 20…

Spring Cloud Alibab --Seata

事务特性 A&#xff08;Atomic&#xff09;&#xff1a;原子性&#xff0c;构成事务的所有操作&#xff0c;要么都执行完成&#xff0c;要么全部不执行&#xff0c;不可能出现部分成功部分失败的情况。 C&#xff08;Consistency&#xff09;&#xff1a;一致性&#xff0c;在事…

Tarjan算法求割点和桥

先进行一些定义&#xff0c;假设目前有一个无向连通图 割点&#xff1a;某点及其边去掉后&#xff0c;图不再连通 桥&#xff1a;某条边去掉后&#xff0c;图不再联通 tarjan算法求割点 不考虑子结点到父结点的情况 dfn(x) x实际杯访问的时间点 low(x) x通过图可回溯到的最…

22从零开始学Java之你知道return、break与continue的区别吗?

作者&#xff1a;孙玉昌&#xff0c;昵称【一一哥】&#xff0c;另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 在上一篇文章中&#xff0c;壹哥给大家介绍了while、do-while两种循环结构&#xff0c;并且给大家总结…

KubeSphere 社区双周报 | OpenFunction 支持 Dapr 状态管理 | 2023.03.31-04.13

KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过 commit 的贡献者&#xff0c;并对近期重要的 PR 进行解析&#xff0c;同时还包含了线上/线下活动和布道推广等一系列社区动态。 本次双周报涵盖时间为&#xff1a;2023.03.31-2023.…

测试工具之JMH详解

文章目录 1 JMH1.1 引言1.2 简介1.3 DEMO演示1.3.1 测试项目构建1.3.2 编写性能测试1.3.3 执行测试1.3.4 报告结果 1.4 注解介绍1.4.1 BenchmarkMode1.4.2 Warmup1.4.3 Measurement1.4.4 Threads1.4.5 Fork1.4.6 OutputTimeUnit1.4.7 Benchmark1.4.8 Param1.4.9 Setup1.4.10 Te…

大数据实战 --- 美团外卖平台

目录 开发环境 数据描述 功能需求 数据准备 数据分析 RDD操作 Spark SQL操作 创建Hbase数据表 创建外部表 统计查询 开发环境 HadoopHiveSparkHBase 启动Hadoop&#xff1a;start-all.sh 启动zookeeper&#xff1a;zkServer.sh start 启动Hive&#xff1a; nohup …

Netty中的HttpServerCodec和HttpObjectAggregator

首先使用Netty搭建一个HttpServer&#xff0c;代码如下&#xff1a; public class App {public static boolean useEpoll false;static {String os System.getProperty("os.name");if (Objects.nonNull(os) && os.equalsIgnoreCase("linux") &a…

Git分支篇git branch和git checkout

分支作用 在开发过程中&#xff0c;项目往往由多人协同开发&#xff0c;那么将多人编写的代码汇总到一起就成了一个困难且复杂的工作&#xff0c;另外项目也需要备份和版本迭代&#xff0c;因此不能只有一个版本。因此分支就成为了优秀的解决方案。 分支相互独立&#xff0c;…

C++STL详解(九)--使用红黑树封装实现set和map

文章目录 控制底层红黑树模板参数模板参数中的仿函数map,set中的正向迭代器map,set中的反向迭代器[]下标访问运算符重载map的模拟实现代码map的模拟实现适用map,set容器的底层红黑树代码(修改版本) 控制底层红黑树模板参数 如果我们用一棵KV模型的红黑树同时实现map和set,我们…

【数据结构】八大排序算法(梭哈)

目录 1.直接插入排序2. * 希尔排序关于希尔排序的时间复杂度 3.选择排序4. * 堆排序5.冒泡排序6. * 快速排序6.1递归快排6.1.1 hoare版6.1.2 挖坑法6.1.3 前后指针法6.1.4 关于每个区间操作的结束位置总是小于key6.1.5 关于有序原数据的效率优化 6.2 非递归快排 7. * 归并排序7…

计算机网络考试复习——第五章

本章考察范围为5.1 5.3 5.4这三部分。 该层传输的单位是报文段 5.1 运输层协议概述&#xff1a; 5.1.1 进程之间的通信&#xff1a; 运输层是向它上面的应用层提供通信服务。它属于面向通信部分的最高层&#xff0c;同时也是用户功能的最低层。 屏蔽作用&#xff1a;运输层…