【LeetCode】【C++】27. 移除元素 80.删除有序数组中的重复项Ⅱ

news2024/9/24 16:22:07

27. 移除元素

题目描述

详见LeetCode 27. 移除元素。

这是一道特别水的题,但是我第一时间没有想到正确的解答思路。

题目描述可以简述为,给定数组nums和元素val,原地删除nums中等于val的元素,并返回nums中不等于val元素的个数。

思路

一开始我确实想到了要使用双指针来做,但是我错误的将第二个指针设置到了nums的尾部,想要将等于val的元素直接和尾部的元素进行交换,这个思路有一个很大的问题在于,尾部的元素也可能等于val。

正确的双指针思路是,设置两个双指针,均从头开始对nums进行遍历,记作left和right。

如果nums[right] != val,意味着可以令nums[left] = nums[right],并将两个指针同时右移,否则只移动right指针。

最后left的值就是nums中不等于val的个数。

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int left = 0;
        int n = nums.size();
        for(int right = 0; right < n; right ++) {
            if(nums[right] != val) {
                nums[left] = nums[right];
                left ++;
            }
        }
        return left;
    }
};

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

题目描述

详见leetcode原题目。

与这道题相似的是26. 删除有序数组中的重复项,这两道题与27. 移除元素类似,都涉及到原地对数组进行操作,都可以使用双指针算法来解决。

这道题目可以简单描述为,给定一个单调不减的数组,请原地删除数组当中的元素,使得重复的元素不超过两个,并返回最终数组的长度。

思路

自己还是太菜了,菜就要多练,参考了LeetCode的题解才想明白。

这道题仍然使用双指针算法来求解,但是不需要插旗来检查当前保留的元素是否超过两个。

需要注意的是对题目的性质进行仔细考察,仔细观察后可以发现,当前仅当当前位置ii-2的元素不相同时,才需要对该位置的元素进行保留操作,这也一定程度上利用了数组的有序性。

因此可以设置两个指针,分别是慢指针slow和快指针fast,使用慢指针slow来对数组当中的元素进行移动,使用快指针fast来对整个数组进行检查。

将这两个指针均初始化为2,如果nums[slow - 2] != nums[fast],说明此时要对数组当中的元素进行移动,即令nums[slow++] = nums[fast]

上述语句看似非常简单,它为什么是合理的呢?考虑nums[slow - 1],如果它与nums[slow - 2]是相等的,注意题目给定的条件,至多保留两个相同的元素,我们无需对它进行操作。只有当nums[slow - 2]nums[fast]不相等的时候,才需要将fast指针处的元素移动到slow指针处。

举个例子,假设有数组[1, 1, 2, 2, 2, 3, 3, 3, 3, 3],初始化的slow和fast都是2,即指向数组的第三个位置。初始化为2的原因是不需要考虑0和1两个位置的元素,而这必然是满足题意的,可以保留。对于fast == 2这个位置,nums[slow - 2]的值是1,与2不等,可以将fast位置的元素移动到slow。此时fast继续移动,移动到下标为3的位置时,nums[slow-2]的值仍然是1,与2不相等,仍然可以将fast位置的元素移动到slow。注意此时slow的值为4,因为保留了两个值为2的元素,slow此时指向的是下一个可能要将元素移动过来的位置。

然而,继续移动fast可以发现,当fast移动到下标为4的位置时,nums[slow-2]的值是2,此时fast和slow - 2指向的元素相等了,由于新数组当中的元素重复的次数不能超过2,所以此时不能将fast位置的元素移动到slow。

继续移动fast至下标为5的位置,此时fast位置的元素为3,slow-2位置的元素为2,slow-1位置的元素也是2,可以将fast位置的元素移动到slow。

代码如下:

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];
            }
            fast ++;
        }
        return slow;
    }
};

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

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

相关文章

北京市朝阳区自闭症寄宿学校:为孩子提供优质照顾与学习环境

北京市朝阳区自闭症寄宿学校的愿景与广州星贝育园的卓越实践 在北京市朝阳区&#xff0c;乃至全国范围内&#xff0c;自闭症儿童的教育与照护一直是社会各界关注的焦点。家长们渴望为孩子找到一所能够提供优质照顾与学习环境的学校&#xff0c;让他们在爱与专业的滋养下茁壮成…

trl中的PPO代码解析(炒冷饭版)

不说其他的解释&#xff0c;上来就看代码。建议先对PPO的整体流程有了解。 trl的版本为0.4.0&#xff0c;注&#xff1a;【新版的trl中代码更复杂&#xff0c;如果只是想读懂PPO具体怎么用trl实现的&#xff0c;0.4.0版本即可】 step1: rollout ppo_trainer.generate()函数…

从入门到精通:QT 100个关键技术关键词

Qt基础概念 Qt Framework - 一个跨平台的C图形用户界面应用程序开发框架。它不仅提供了丰富的GUI组件&#xff0c;还包括网络、数据库访问、多媒体支持等功能。 Qt Creator - Qt官方提供的集成开发环境&#xff08;IDE&#xff09;&#xff0c;集成了代码编辑器、项目管理工具、…

2024年AI技术爆发的元年,用对工具,让你副业比主业赚得多!

大家好&#xff0c;我是强哥 文字的力量不容小觑&#xff0c;或许你没有多好的文笔&#xff0c;或许你已经很久没有拿笔写字了&#xff0c;但是没关系&#xff0c;我们有工具&#xff01; AI时代的到来&#xff0c;不会用工具&#xff0c;那你可就OUT了 如果你觉得文字不能赚…

Convert excel format exception.You can try specifying the ‘excelType‘

在使用easyexcel读取文件流获取集合的时候报了这个错 在点进代码抛出异常的地方&#xff0c;发现这么一段逻辑 是通过文件流的前8个字节来判断文件的类型&#xff0c;实际上这种判断规则是无法保证准确的。然后自然的想到是不是引入的jar包版本太旧了&#xff0c;所以有这个b…

Axure大屏可视化模板:跨领域数据分析平台原型案例

随着信息技术的飞速发展&#xff0c;数据可视化已成为各行各业提升管理效率、优化决策过程的重要手段。Axure作为一款强大的原型设计工具&#xff0c;其大屏可视化模板在农业、园区、城市、企业数据可视化、医疗等多个领域得到了广泛应用。本文将通过几个具体案例&#xff0c;展…

安全测试|如何使用burpsuite+xray实现联动测试

目的&#xff1a;安全测试过程中手动分析测试与xray自动化扫描测试结合&#xff0c;这样可以从多层保障安全测试的分析&#xff0c;针对平台业务接口量大的安全测试是十分有用的&#xff0c;可以实现双向测试同时开始。 1.xray 安装和使用 1.1 下载地址&#xff1a;xray commu…

git push错误:Out of memory, malloc failed (tried toallocate 947912704 bytes)

目录 一、错误截图 二、解决办法 一、错误截图 因项目文件过大&#xff0c;http.postBuffer设置的内存不够&#xff0c;所以报错。 二、解决办法 打开cmd窗口&#xff0c;执行如下命令即可 git config --global http.postBuffer 1024000000 如图所示 执行完成以后&#…

WinCC中归档数据片段的时间和尺寸设置

1&#xff0e;归档数据片段介绍工控人加入PLC工业自动化精英社群 1.1 概述 WinCC V6.2 开始的后台数据库采用了MS SQL Server 2005 &#xff0c;所以归档方式与V5 有所不同&#xff0c;它的运行数据存放在数据片段&#xff08;segment&#xff09;当中&#xff0c;工程师可以…

Protobuf:基本概念与使用流程

Protobuf&#xff1a;基本概念与使用流程 基本概念Linux 安装使用流程.proto文件编译使用 运行机制 基本概念 在进行网络编程时&#xff0c;经常需要进行数据传输&#xff0c;只有双方主机都保证数据格式的一致性&#xff0c;才能保证数据被正常解析。这个过程称为序列化与反序…

召回04 离散特征的处理

推荐系统会将一个id映射成一个向量 Qne-Hot编码 Embedding(嵌入)&#xff1a; 把每个类别映射成一个低维的稠密向量

Drive.js 的一些 Api 使用记录

文章目录 2024 年 drive.js 的基础使用想在下一步的时候处理些逻辑呢&#xff1f;(同步)Element 的各种选择器 2024 年 drive.js 的基础使用 安装就跳过了 npm install driver.js &#xff0c;一行代码就可以搞定 官网的 Basic Usage 基础使用的截图如下&#xff1a; 想在下…

C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究

思考这样一串代码的运行结果&#xff1a; #include <iostream> using namespace std; class Person { public:~Person() { cout << "~Person()" << endl; } }; class Student:public Person { public:~Student() { cout << "~Student(…

线程池工作原理?

线程池的工作原理&#xff1a; 当任务过来时&#xff0c;如果线程池中的线程数小于核心线程数&#xff0c;就创建线程。&#xff08;默认情况下&#xff0c;线程池不会预先创建线程&#xff0c;但可以配置&#xff09;当核心线程数满了以后&#xff0c;提交过来的任务会放到阻塞…

Axure9破解

1.下载安装包 通过百度网盘分享的文件&#xff1a;Axure RP 9.zip 链接&#xff1a;https://pan.baidu.com/s/1Lcu-gg4qF8tTkOlt7bC2ww?pwdwmqq 提取码&#xff1a;wmqq 2.设置登录以及破解码 位置&#xff1a;帮助-管理授权-添加key Licensee&#xff1a;123456 Key&#…

Ping32:一站式终端安全解决方案,企业安心之选

在数字化时代&#xff0c;企业的终端安全面临着前所未有的挑战。随着网络威胁的日益复杂化和多样化&#xff0c;如何确保终端设备的安全稳定运行&#xff0c;保护企业敏感数据不被泄露&#xff0c;成为了每个企业必须面对的重要课题。正是在这样的背景下&#xff0c;Ping32作为…

第十四届蓝桥杯嵌入式国赛

一. 前言 本篇博客主要讲述十四届蓝桥杯嵌入式的国赛题目&#xff0c;包括STM32CubeMx的相关配置以及相关功能实现代码以及我在做题过程中所遇到的一些问题和总结收获。如果有兴趣的伙伴还可以去做做其它届的真题&#xff0c;可去 蓝桥云课 上搜索历届真题即可。 二. 题目概述 …

探索LLM中的CoT链式推理:ECHO方法深度解读

近年来&#xff0c;随着大型语言模型&#xff08;LLMs&#xff09;的快速发展&#xff0c;如何有效利用这些模型进行复杂任务的推理成为了研究热点。其中&#xff0c;链式思考&#xff08;Chain-of-Thought, CoT&#xff09;推理方法作为一种有效的策略&#xff0c;能够显著提升…

Redhat 6,7,8系(复刻系列) 一键部署Oracle12c zip

Oracle12c前言 Oracle 12c是甲骨文公司推出的一款关系数据库管理系统,它引入了多项创新特性,如多租户架构、大数据处理和云部署,适用于企业级应用。以下是Oracle 12c的详细介绍: Oracle 12c的主要特点 高性能:通过多线程处理、自动优化等技术,提高了数据库的查询和处理…

云栖大会 | 天润融通发布微藤智能体平台,中国客户联络正式进入“智能体时代”

9月19日&#xff0c;以“云启智跃&#xff0c;产业蝶变”为主题的2024云栖大会在杭州正式开幕。大会持续三天&#xff0c;聚焦AI时代的技术升级与实践应用&#xff0c;设有三大主论坛、400多个分论坛&#xff0c;并开放4万平方米的智能科技展区&#xff0c;展示全球百余款AI应用…