力扣LeetCode: 80 删除有序数组中的重复项Ⅱ

题目:

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

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

说明:

为什么返回数值是整数,但输出的答案是数组呢?

请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。

你可以想象内部操作如下:

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

示例 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。不需要考虑数组中超出新长度后面的元素。

提示:

  • 1 <= nums.length <= 3 * 10^4
  • -10^4 <= nums[i] <= 10^4
  • nums 已按升序排列

解法一:双指针

解决思路

  1. 有序数组的特性

    • 因为数组是有序的,所以重复的元素一定是连续的。

    • 我们需要确保每个元素最多出现两次。

  2. 双指针法

    • 使用两个指针:slow 和 fast

    • slow 指针用于构建新数组,指向当前可以放置新元素的位置。

    • fast 指针用于遍历原数组,检查每个元素是否可以保留。

  3. 核心逻辑

    • 如果当前元素 nums[fast] 不等于 nums[slow - 2],说明 nums[fast] 可以保留,并且不会导致重复超过两次。

    • 将 nums[fast] 放到 nums[slow] 的位置,然后移动 slow 指针。

    • 如果 nums[fast] 等于 nums[slow - 2],说明 nums[fast] 已经出现了两次,跳过它。

  4. 边界条件

    • 如果数组长度小于等于 2,直接返回原数组长度,因为不可能有重复超过两次的元素。

class Solution {
public:int removeDuplicates(vector<int>& nums) {int n = nums.size();if (n <= 2) return n; // 如果数组长度小于等于2,直接返回
  • n = nums.size():获取数组的长度。

  • if (n <= 2) return n;:如果数组长度小于等于 2,直接返回原数组长度,因为不可能有重复超过两次的元素。

        int slow = 2; // 慢指针从索引2开始for (int fast = 2; fast < n; ++fast) {
  • slow = 2:慢指针从索引 2 开始,因为前两个元素无论如何都可以保留。

  • for (int fast = 2; fast < n; ++fast):快指针从索引 2 开始遍历数组。

            // 如果当前元素不等于慢指针前两个元素if (nums[fast] != nums[slow - 2]) {nums[slow] = nums[fast]; // 将当前元素放到慢指针位置++slow; // 移动慢指针}
  • if (nums[fast] != nums[slow - 2])

    • 检查当前元素 nums[fast] 是否等于 nums[slow - 2]

    • 如果不等,说明 nums[fast] 可以保留,并且不会导致重复超过两次。

  • nums[slow] = nums[fast];

    • 将 nums[fast] 放到 nums[slow] 的位置。

  • ++slow;

    • 移动慢指针,指向下一个可以放置新元素的位置。

        }return slow; // 返回新数组的长度}
};
  • return slow;

    • 最终 slow 指针的位置就是新数组的长度。

完整代码

class Solution {
public:int removeDuplicates(vector<int>& nums) {int n = nums.size();if (n <= 2) return n; // 如果数组长度小于等于2,直接返回int slow = 2; // 慢指针从索引2开始for (int fast = 2; fast < n; ++fast) {// 如果当前元素不等于慢指针前两个元素if (nums[fast] != nums[slow - 2]) {nums[slow] = nums[fast]; // 将当前元素放到慢指针位置++slow; // 移动慢指针}}return slow; // 返回新数组的长度}
};

解法二:计数器遍历

  1. 遍历数组,使用一个计数器来记录当前元素的出现次数。

  2. 如果当前元素与前一个元素相同,则增加计数器。

  3. 如果当前元素与前一个元素不同,则重置计数器。

  4. 如果计数器的值小于等于2,则保留该元素,否则跳过该元素。

class Solution {
public:int removeDuplicates(vector<int>& nums) {if (nums.size() <= 2) {return nums.size();}int index = 1;  // 从第二个元素开始int count = 1;  // 计数器,记录当前元素的出现次数for (int i = 1; i < nums.size(); ++i) {if (nums[i] == nums[i - 1]) {count++;} else {count = 1;  // 重置计数器}if (count <= 2) {nums[index++] = nums[i];}}return index;}
};

代码解释:

  • index 用于记录新数组的长度,同时也是一个指针,指向当前可以放置新元素的位置。

  • count 用于记录当前元素的出现次数。

  • 遍历数组时,如果当前元素与前一个元素相同,则增加 count;否则重置 count

  • 如果 count 小于等于2,则将当前元素放入 nums[index] 位置,并增加 index

  • 最终返回 index,即新数组的长度。

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

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

相关文章

redis之GEO 模块

文章目录 背景GeoHash 算法redis中的GeoHash 算法基本使用增加距离获取元素位置获取元素的 hash 值附近的元素 注意事项原理 背景 如果我们有需求需要存储地理坐标&#xff0c;为了满足高性能的矩形区域算法&#xff0c;数据表需要在经纬度坐标加上双向复合索引 (x, y)&#x…

51单片机俄罗斯方块清屏函数

/************************************************************************************************************** * 名称&#xff1a;LED_Clr * 功能&#xff1a;清屏 * 参数&#xff1a;NULL * 返回&#xff1a;NULL * 备注&#xff1a;temp数组为动态显示数据&#xff…

如何启用 Apache Rewrite 重写模块 ?

Apache 的 mod_rewrite 是最强大的 URL 操作模块之一。使用 mod_rewrite&#xff0c;您可以重定向和重写 url&#xff0c;这对于在您的网站上实现 seo 友好的 URL 结构特别有用。在本文中&#xff0c;我们将引导您了解如何在基于 Debian 和基于 RHEL 的系统上在 Apache 中启用 …

动手学图神经网络(9):利用图神经网络进行节点分类 WeightsBiases

利用图神经网络进行节点分类Weights&Biases 引言 在本篇博客中,将深入探讨如何使用图神经网络(GNNs)来完成节点分类任务。以 Cora 数据集为例,该数据集是一个引用网络,节点代表文档,推断每个文档的类别。同时,使用 Weights & Biases(W&B)来跟踪实验过程和…

“深入浅出”系列之C++:(19)C++14

C14的新拓展 自动类型推导&#xff08;auto&#xff09;的增强&#xff1a; C14在auto关键字的基础上进行了优化&#xff0c;使得类型推导更加智能。例如&#xff0c;可以使用auto来声明Lambda表达式的返回类型和参数类型&#xff0c;减少了繁琐的类型声明。 示例代码&#…

STM32单片机学习记录(2.9)

一、STM32 15.1 - FLASH闪存 1. FLASH简介 &#xff08;1&#xff09;STM32系列的FLASH包含程序存储器、系统存储器和选项字节三个部分&#xff0c;通过闪存存储器接口&#xff08;外设&#xff09;可以对程序存储器和选项字节进行擦除和编程&#xff1b; &#xff08;2&#x…

尚硅谷课程【笔记】——大数据之Zookeeper【二】

课程视频&#xff1a;【尚硅谷Zookeeper教程】 四、Zookeeper实战 4.1分布式安装部署 1. 集群规划 在Hadoop102、Hadoop103和Hadoop104三个节点上部署Zookeeper 2. 解压安装 1&#xff09;解压Zookeeper.tar.gz到指定目录 tar -zxvf zookeeper-3.7.2.tar.gz -C /opt/mod…

<论文>DeepSeek-R1:通过强化学习激励大语言模型的推理能力(深度思考)

一、摘要 本文跟大家来一起阅读DeepSeek团队发表于2025年1月的一篇论文《DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning | Papers With Code》&#xff0c;新鲜的DeepSeek-R1推理模型&#xff0c;作者规模属实庞大。如果你正在使用Deep…

rockmq配置出现的问题

环境注意事项 java要配置javahome-- java8&#xff0c;并且rockmq配置 根目录 解决方法&#xff1a; https://blog.csdn.net/weixin_46661658/article/details/133753627 如果执行第二步报错jar的路径 命令&#xff1a; start mqbroker.cmd -n 127.0.0.1:9876 autoCreateTop…

Spring Boot 3.4 中 MockMvcTester 的新特性解析

引言 在 Spring Boot 3.4 版本中&#xff0c;引入了一个全新的 MockMvcTester 类&#xff0c;使 MockMvc 测试可以直接支持 AssertJ 断言。本文将深入探讨这一新特性&#xff0c;分析它如何优化 MockMvc 测试并提升测试的可读性。 Spring MVC 示例 为了演示 MockMvcTester 的…

上传文件防木马函数

项目环境&#xff1a;TP6、TP5 问题&#xff1a;解决旧项目中上传上来的文件校验不严格。导致会有木马文件入侵的情况发生。除了上篇博文中提及的限制上传文件存储的目录不可执行php文件外。仍需在入口处严格检验上传文件的类型&#xff0c;排除php类可执行文件上传。 解决&a…

来自国外的实用软件 ,已接触所有限制!

今天我给大家带来了一款超棒的全自动抠图软件&#xff0c;真的是一个来自国外的宝藏工具&#xff01;而且好消息是&#xff0c;它现在完全解除了限制&#xff0c;可以无限畅快地使用了。 Teorex PhotoScissors 抠图软件 这款软件特别贴心&#xff0c;根本不需要安装&#xff0…

Spring Boot 的问题:“由于无须配置,报错时很难定位”,该怎么解决?

Spring Boot 的 "由于无须配置&#xff0c;报错时很难定位" 主要指的是&#xff1a; 传统 Spring 框架 需要大量 XML 或 Java 配置&#xff0c;开发者对应用的组件、Bean 加载情况有清晰的控制&#xff0c;出错时可以从配置入手排查。Spring Boot 采用自动配置&…

12. k8s二进制集群之kubelet部署

什么是kubelet准备事项创建kubelet-bootstrap.kubeconfig文件创建kubelet配置文件创建kubelet服务配置文件(将kubelet配置成系统服务)分发CA证书及Kubelet-bootstrap.kubeconfig到所有工作节点最后启动工作节点的kubelet服务总结什么是kubelet Kubelet 是 Kubernetes 的核心…

Jetbrains IDE http客户端使用教程

简介 JetBrains IDE&#xff08;如IntelliJ IDEA&#xff0c; WebStorm&#xff0c; PhpStorm和PyCharm&#xff09;自带一个内置的HTTP客户端&#xff0c;允许直接从IDE发送HTTP请求&#xff0c;而无需使用第三方工具&#xff0c;如Postman或cURL。 JetBrains IDE 中的 HTTP…

活动预告 |【Part1】Microsoft Azure 在线技术公开课:AI 基础知识

课程介绍 参加“Azure 在线技术公开课&#xff1a;AI 基础知识”活动&#xff0c;了解 AI 核心概念。参加我们举办的本次免费培训活动&#xff0c;了解组织如何使用 AI 技术克服实际挑战&#xff0c;以及如何借助 Azure AI 服务构建智能应用程序。本次培训适用于任何对 AI 解决…

小红书提出新面部视频交换方法DynamicFace,可生成高质量且一致的视频面部图像。

DynamicFace是一种新颖的面部视频交换方法&#xff0c;旨在生成高质量且一致的视频面部图像。该方法结合了扩散模型的强大能力和可插拔的时间层&#xff0c;以解决传统面部交换技术面临的两个主要挑战&#xff1a;在保持源面部身份的同时&#xff0c;准确传递目标面部的运动信息…

如何使用 DataX 连接 Easysearch

DataX DataX 是阿里开源的一款离线数据同步工具&#xff0c;致力于实现包括关系型数据库(MySQL、Oracle 等)、HDFS、Hive、ODPS、HBase、FTP 等各种异构数据源之间稳定高效的数据同步功能。 本篇主要介绍 DataX 如何将数据写入到 Easysearch&#xff0c;对于各种数据源的连接…

redis底层数据结构——整数集合

文章目录 定义内部实现升级升级的好处提升灵活性节约内存 降级总结 定义 整数集合&#xff08;intset&#xff09;是集合键的底层实现之一&#xff0c;当一个集合只包含整数值元素&#xff0c;并且这个集合的元素数量不多时&#xff0c;Redis就会使用整数集合作为集合键的底层…

【力扣题解】63. 不同路径 II

&#x1f60a;博主目前也在学习&#xff0c;有错误欢迎指正&#x1f60a; &#x1f308;保持热爱 奔赴星海&#x1f308; 文章目录 一、题目1、题目描述2、基础框架3、原题链接 二、解题报告1、思路分析2、代码详解 三、本题知识 一、题目 1、题目描述 给定一个 m x n 的整数数…