力扣80、删除有序数组中的重复项Ⅱ(中等)

1 题目描述

图1 题目描述

2 题目解读

        对于有序数组nums,要求在不使用额外数组空间的条件下,删除数组nums中重复出现的元素,使得nums中出现次数超过两次的元素只出现两次。返回删除后数组的新长度。

3 解法一:双指针

        双指针法可以很好地解决此题。

3.1 解题思路

        设置双指针,从数组nums的第3个元素开始比较,直到nums的最后一个元素。

3.2 设计代码

#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int n = nums.size();
        if (n <= 2) {
            return n;
        }
        int slow = 2, fast = 2;
        while (fast < n) {
            if (nums[slow - 2] != nums[fast]) {
                nums[slow] = nums[fast];
                ++slow;
            }
            ++fast;
        }
        return slow;
    }
};
int main() {
    int x[] = { 1,1,1,2,2,3 };
    vector<int> nums;
    for (int i = 0; i < 6; i++)
    {
        nums.push_back(x[i]);
    }
    Solution S;
    int ans = S.removeDuplicates(nums);
    cout << ans << endl;
    return 0;
}

3.3 复杂度分析

  • 时间复杂度:O(n)。while循环遍历了一遍数组元素。
  • 空间复杂度:O(1)。没有使用额外数组空间。

3.4 提交结果

图2 双指针法代码执行结果

4 解法二:前移法

        前移法是由双指针法扩展出来的一种方法,与双指针法有着相似的思想。

4.1 解题思路

        设置指针right,从数组nums的第3个元素开始遍历,使用变量k记录需要移除的元素的个数,将需要移动的元素前移k个位置。

4.2 设计代码

#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int n = nums.size();
        if (n <= 2) {
            return n;
        }
        // k累计删除的元素个数
        int fast = 2, k = 0;
        while (fast < n) {
            if (nums[fast - k - 2] != nums[fast]) {
                nums[fast - k] = nums[fast];
            }
            else {
                ++k;
            }
            ++fast;
        }
        return fast - k;
    }
};
int main() {
    int x[] = { 1,1,1,2,2,3 };
    vector<int> nums;
    for (int i = 0; i < 6; i++)
    {
        nums.push_back(x[i]);
    }
    Solution S;
    int ans = S.removeDuplicates(nums);
    cout << ans << endl;
    return 0;
}

4.3 复杂度分析

  • 时间复杂度:O(n)。while循环遍历了一遍数组nums的元素。
  • 空间复杂度:O(1)。没有使用额外数组空间。

4.4 提交结果

图3 前移法代码执行结果

5 解题心得

  • 让有序数组nums中重复出现的元素只出现两次,是让其只出现一次的变体题目,难度更大。
  • 双指针法与前移法之间,可以相互转换。
  • 双指针法中,left指针用于放置新元素。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【代码随想录-数组】二分查找

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

学习笔记-李沐动手学深度学习(四)(12-13,权重衰退、L2正则化、Dropout)

总结 【trick】过拟合及正则化项参数的理解 实际数据都有噪音&#xff0c;一般有噪音后&#xff0c;模型实际学习到的权重w就会比 理论上w的最优解&#xff08;即没有噪音时&#xff09;大。&#xff08;QA中讲的&#xff09; 【好问题】 &#xff08;1&#xff09;不使用正…

Jupyter Notebook安装以及简单使用教程

Jupyter Notebook安装以及简单使用教程 本文章将&#xff0c;简要的讲解在已经拥有Python环境下如何进行Jupyter Notebook的安装。并且简短的介绍Jupyter Notebook的使用方法。 Jupyter Notebook是什么 Jupyter Notebook是一个基于Web的交互式计算环境&#xff0c;它支持多种…

101.乐理基础-五线谱-五线谱的构造、谱号是什么

内容参考于&#xff1a;三分钟音乐社 上一个内容&#xff1a;100.乐理基础-五线谱-是否需要学习五线谱-CSDN博客 首先简谱的构造&#xff0c;如下图&#xff1a;真正影响音乐的是左上角的三部分&#xff0c;调号、拍号、情绪与速度&#xff0c;如图1 然后不管用什么谱&#xf…

代码随想录第十七天| ● 110.平衡二叉树 ● 257. 二叉树的所有路径 ● 404.左叶子之和

文章目录 110.平衡二叉树思路-递归&#xff1a;代码&#xff1a; 思路二-迭代 257. 二叉树的所有路径思路一&#xff1a;普通递归 思路二&#xff1a;递归优化思路三&#xff1a;迭代法&#xff08;没细看&#xff09; 404.左叶子之和思路-递归 110.平衡二叉树 思路-递归&#…

解决WinForms跨线程操作控件的问题

解决WinForms跨线程操作控件的问题 介绍 在构建Windows窗体应用程序时&#xff0c;我们通常会遇到需要从非UI线程更新UI元素的场景。由于WinForms控件并不是线程安全的&#xff0c;直接这样做会抛出一个异常&#xff1a;“控件’control name’是从其他线程创建的&#xff0c;…

Oracle DG环境下的秘钥管理

今天有朋友问到1&#xff09;DG环境下的秘钥管理需要注意什么&#xff0c;2&#xff09;秘钥管理对DG的日志同步有影响吗&#xff1f; 对于2&#xff09;的回答是明确的&#xff0c;没有影响。秘钥的管理和DG的redo log shipping完全是两套机制。在最新版的Oracle Key Vault常…

基于YOLOv7算法的高精度实时五类动物目标检测系统(PyTorch+Pyside6+YOLOv7)

摘要&#xff1a;基于YOLOv7算法的高精度实时五类动物目标检测系统可用于日常生活中检测与定位狼、鹿、猪、兔和浣熊&#xff0c;此系统可完成对输入图片、视频、文件夹以及摄像头方式的目标检测与识别&#xff0c;同时本系统还支持检测结果可视化与导出。本系统采用YOLOv7目标…

多数据源 dynamic-datasource 模块使用

在项目中引入dynamic-datasource该modul 在application.yml中添加 dynamic:datasource:slave1: driver-class-name: oracle.jdbc.OracleDriverurl: jdbc:oracle:thin:XXX:orcl_tjhusername: XXpassword: XXvalidation-query: SELECT 1 FROM DUALslave2: driver-class-name: co…

广东建筑模板厂家批发-建筑木模板市场供应

近年来&#xff0c;随着建筑行业的快速发展&#xff0c;建筑模板作为一种不可或缺的建筑材料&#xff0c;备受关注。广东作为中国建筑业的重要发展地区之一&#xff0c;其建筑模板市场也日渐繁荣。在这个市场中&#xff0c;建筑模板厂家能强优品木业成为了备受青睐的选择&#…

操作符详解(上)

目录 操作符的分类 二进制和进制转换 2进制转10进制 10进制转2进制数字 2进制转8进制 2进制转16进制 原码、反码、补码 移位操作符 左移操作符 右移操作符 位操作符&#xff1a;&、|、^、~ 单目操作符 逗号表达式 操作符的分类 • 算术操作符&#xff1a; …

大数据学习之Flink,了解Flink的多种部署模式

目录 一、部署模式 1. 部署模式分类&#xff1a; 1.1 会话模式&#xff08;Session Mode&#xff09;&#xff1a; 优点&#xff1a; 缺点&#xff1a; 1.2 单作业模式&#xff08;Per-Job Mode&#xff09;&#xff1a; 优点&#xff1a; ​ 缺点&#xff1a; ​ 1.3…

Kubernetes/k8s之安全机制:

k8s当中的安全机制 核心是分布式集群管理工具&#xff0c;容器编排&#xff0c;安全机制核心是:API SERVER作为整个集群内部通信的中介&#xff0c;也是外部控制的入口&#xff0c;所有的安全机制都是围绕api server开设计的。 请求api资源 1、认证 2、鉴权 3、准入机制 三…

【技术预研】StarRocks官方文档浅析(2)

背景说明 基于starRocks官方文档&#xff0c;对其内容进行一定解析&#xff0c;方便大家理解和使用。 若无特殊标注&#xff0c;startRocks版本是3.2。 下面的章节和官方文档保持一致。 参考文档 产品简介 | StarRocks StarRocks StarRocks 是一款高性能分析型数据仓库&…

Conda python管理环境environments 四 从入门到精通

Conda系列&#xff1a; 翻译: Anaconda 与 miniconda的区别Miniconda介绍以及安装Conda python运行的包和环境管理 入门Conda python管理环境environments 一 从入门到精通Conda python管理环境environments 二 从入门到精通Conda python管理环境environments 三 从入门到精通…

CSS复合选择器和CSS层叠性、继承性有哪些内容?

知识引入 1.CSS复合选择器 书写CSS样式表时&#xff0c;可以使用CSS基础选择器选中目标元素。但是在实际网站开发中&#xff0c;一个网页中可能包含成千上万的元素&#xff0c;如果仅使用CSS基础选择器&#xff0c;是远远不够的。为此&#xff0c;CSS提供了几种复合选择器&am…

【论文笔记】Learning Deconvolution Network for Semantic Segmentation

重要说明&#xff1a;严格来说&#xff0c;论文所指的反卷积并不是真正的 deconvolution network 。 关于 deconvolution network 的详细介绍&#xff0c;请参考另一篇博客&#xff1a;什么是Deconvolutional Network&#xff1f; 一、参考资料 Learning Deconvolution Netwo…

命令行启动Android Studio模拟器

1、sdk路径查看&#xff08;打开Android Studio&#xff09; 以上前提是安装的Android Studio并添加了模拟器&#xff01;&#xff01;&#xff01; 2、复制路径在终端进入到 cd /Users/duxi/Library/Android/sdk目录&#xff08;命令行启动不用打开Android Studio就能运行模拟…

深入理解ZooKeeper分布式锁

第1章&#xff1a;引言 分布式系统&#xff0c;简单来说&#xff0c;就是由多台计算机通过网络相连&#xff0c;共同完成任务的系统。想象一下&#xff0c;咱们平时上网浏览网页、看视频&#xff0c;背后其实都是一大堆服务器在协同工作。这些服务器之间需要协调一致&#xff…

微信小程序元素/文字在横向和纵向实现居中对齐、两端对齐、左右对齐、上下对齐

元素对齐往往是新学者的一大困惑点&#xff0c;在此总结常用的各种元素和文字对齐方式以供参考&#xff1a; 初始显示 .wxml <view style"width: 100%;height: 500rpx; background-color: lightgray;"><view style"width: 200rpx;height:100rpx;bac…