C++算法练习-day2——27.移除元素

题目来源:. - 力扣(LeetCode)

题目思路分析

给定一个有序数组和一个目标值,题目要求从数组中移除所有等于目标值的元素,并返回移除后数组的新长度。注意,题目要求原地修改数组,即不使用额外的数组空间。

为了解决这个问题,我们可以使用双指针方法。设置一个左指针left,初始指向数组的第一个元素;设置一个右指针right,初始指向数组的最后一个元素。然后,我们进行以下操作:

  1. 如果左指针指向的元素等于目标值,那么我们需要将其替换为一个不等于目标值的元素。由于数组是有序的,我们可以选择右指针指向的元素(只要右指针还没有遍历完数组)。但是,在替换之前,我们需要检查右指针指向的元素是否也等于目标值。如果等于,我们就将右指针向左移动,直到找到一个不等于目标值的元素。然后,我们将这个元素复制到左指针的位置,并将右指针向左移动一位。

  2. 如果左指针指向的元素不等于目标值,那么我们就将左指针向右移动一位,继续检查下一个元素。

  3. 重复上述步骤,直到左指针超过右指针。

最后,左指针的位置就是新数组的长度(因为左指针及其右边的元素都是已经被替换或保留的不等于目标值的元素)。

代码实例及注解

实例:

#include <vector>  class Solution {  
public:  int removeElement(std::vector<int>& nums, int val) {  // 初始化左右指针  int left = 0;  int right = nums.size() - 1;  // 当左指针小于等于右指针时,继续遍历数组  while (left <= right) {  // 如果左指针指向的元素等于目标值  if (nums[left] == val) {  // 如果右指针指向的元素不等于目标值,则将其复制到左指针的位置  // 并注意要将右指针向左移动一位  if (nums[right] != val) {  nums[left] = nums[right];  } else {  // 如果右指针指向的元素也等于目标值,则只将右指针向左移动一位  right--;  }  // 由于左指针指向的元素被替换或即将被替换,因此不需要移动左指针  } else {  // 如果左指针指向的元素不等于目标值,则左指针向右移动一位  left++;  }  // 注意:这里不需要显式地移动右指针向左,因为在上面的if语句中已经处理了  // 只有在nums[right] != val的情况下,我们才会执行nums[left] = nums[right],  // 然后无论是否替换,我们都会在下一次循环迭代中检查right-1或left+1的位置。  }  // 返回新数组的长度,即左指针的位置(因为左指针及其右边的元素都是不等于目标值的)  // 注意:这里返回的是长度,而不是右指针的位置+1(因为右指针可能已经越界或指向了一个被移除的元素)  return left;  }  
};  // 注意:上述代码可以进一步优化。实际上,我们不需要每次都检查nums[right] != val,  
// 因为即使nums[right] == val,我们也可以通过将right--来跳过它。  
// 下面的优化版本省略了这个检查,并简化了代码。  class SolutionOptimized {  
public:  int removeElement(std::vector<int>& nums, int val) {  int left = 0;  int right = nums.size() - 1;  while (left <= right) {  if (nums[left] == val) {  nums[left] = nums[right--]; // 直接替换并移动右指针  // 注意:这里不需要再次检查nums[right](因为即使它等于val,下一次循环也会处理)  // 但是,如果nums[right]原本就不等于val,并且我们将其复制到了nums[left],  // 那么下一次循环迭代时,left会指向这个新复制的元素(它不等于val),  // 因此我们可以继续向右移动left指针(在else分支中)。  } else {  left++; // 左指针指向的元素不等于目标值,向右移动  }  }  return left; // 返回新数组的长度  }  
};

注解

  • 在优化版本中,我们省略了对nums[right] != val的检查,因为即使nums[right]等于val,我们也可以通过将right--来跳过它,并在下一次循环迭代中处理。
  • 注意,在替换元素后,我们不需要再次检查被替换的元素(即nums[left])是否等于val,因为我们已经用nums[right]的值替换了它,而nums[right]的值是在替换之前就已经确定的。
  • 最后返回的是左指针的位置,它表示新数组的长度(因为左指针及其右边的元素都是已经被保留的不等于目标值的元素)。

知识点摘要

  1. 双指针方法:在处理有序数组或链表时,双指针方法是一种常用的技巧,可以高效地解决问题。
  2. 原地修改数组:题目要求不使用额外的数组空间,因此我们需要原地修改数组。这通常意味着我们需要通过交换或复制数组中的元素来达到目的。
  3. 边界条件处理:在处理数组或链表时,需要注意边界条件,如指针是否越界、数组是否为空等。
  4. 时间复杂度:由于我们使用了双指针方法,并且每个元素最多只被访问一次,因此该算法的时间复杂度为O(n),其中n是数组的长度。

通过本文的讲解和代码实例,相信读者已经对如何从有序数组中移除特定元素并返回新数组长度有了更深入的理解。

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

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

相关文章

YoloV8改进:Block改进|使用ContextAggregation模块改善C2f模块|即插即用

摘要 在计算机视觉领域,目标检测与实例分割任务一直是研究的热点。YoloV8作为目标检测领域的佼佼者,凭借其出色的性能和效率赢得了广泛的认可。然而,随着技术的不断进步,如何进一步提升YoloV8的性能成为了我们追求的目标。近期,我们引入了ContextAggregation模块对YoloV8…

信息安全工程师(53)网络安全审计机制与实现技术

前言 网络安全审计机制是指为了保护网络安全并发现潜在风险和漏洞而进行的一系列审计活动。审计的目的是检查并评估网络系统的安全性&#xff0c;以确保其符合相关法律法规和安全标准。 一、网络安全审计机制的重要性 网络安全审计机制对于保护组织的信息资产和敏感数据至关重要…

LabVIEW提高开发效率技巧----高效文件I/O

在LabVIEW开发中&#xff0c;文件I/O操作常常是性能瓶颈之一&#xff0c;特别是处理大数据时&#xff0c;如何高效地存储和读取数据显得尤为重要。本文将详细介绍如何利用TDMS Streaming来实现高效的文件I/O&#xff0c;并结合具体例子说明在实际开发中的应用技巧。 1. 什么是T…

[漏洞挖掘与防护] 04.Windows系统安全缺陷之5次Shift漏洞启动计算机机理分析

这是作者新开的一个专栏——“漏洞挖掘与防护”,前期会复现各种经典和最新漏洞,并总结防护技巧;后期尝试从零学习漏洞挖掘技术,包括Web漏洞和二进制及IOT相关漏洞,以及Fuzzing技术。新的征程,新的开启,漫漫长征路,偏向虎山行。享受过程,感谢您的陪伴,一起加油~ 欢迎关…

迅为RK3562开发板/核心板240PIN引脚全部引出,产品升级自如

可应用于人脸跟踪、身体跟踪、视频监控、自动语音识别(ASR)、图像分类驾驶员辅助系统(ADAS)、车牌识别、物体识别等。 iTOP-3562开发板/核心板采用瑞芯微RK3562处理器&#xff0c;内部集成了四核A53Mali G52架构&#xff0c;主频2GHZ&#xff0c;内置1TOPSNPU算力&#xff0c;R…

Gin框架操作指南08:日志与安全

官方文档地址&#xff08;中文&#xff09;&#xff1a;https://gin-gonic.com/zh-cn/docs/ 注&#xff1a;本教程采用工作区机制&#xff0c;所以一个项目下载了Gin框架&#xff0c;其余项目就无需重复下载&#xff0c;想了解的读者可阅读第一节&#xff1a;Gin操作指南&#…

Redis Geo 数据类型解析:基于 ZSET 的高效地理位置管理0708

根据官网介绍&#xff1a; Bitmaps are not an actual data type, but a set of bit-oriented operations defined on the String type which is treated like a bit vector. Since strings are binary safe blobs and their maximum length is 512 MB, they are suitable to s…

【回顾一下AQS知识,关于公平锁与非公平锁】

文章目录 一.什么是AQS二.公平锁和非公平锁实现三.公平锁和非公平锁的区别四.小结 一.什么是AQS AQS&#xff0c;全称 AbstractQueuedSynchronizer&#xff0c;是 Java 中用于构建锁和同步器的一个基础框架类&#xff0c;位于 java.util.concurrent.locks 包中。AQS 通过一个先…

Android 15 推出新安全功能以保护敏感数据

Android 15 带来了增强的安全功能&#xff0c;可保护您的敏感健康、财务和个人数据免遭盗窃和欺诈。 它还为大屏幕设备带来了生产力改进&#xff0c;并对相机、消息和密钥等应用进行了更新。 Android 防盗保护 Google 开发并严格测试了一套全面的功能&#xff0c;以在盗窃之…

Java基础(6)

深拷贝和浅拷贝区别了解吗&#xff1f;什么是引用拷贝&#xff1f;关于深拷贝和浅拷贝区别&#xff0c;我这里先给结论&#xff1a;浅拷贝&#xff1a;浅拷贝会在堆上创建一个新的对象&#xff08;区别于引用拷贝的一点&#xff09;&#xff0c;不过&#xff0c;如果原对象内部…

谷歌浏览器如何展示小于12px的字

在谷歌浏览器里面&#xff0c;字体最小只能设置为12px&#xff0c;但是我们有时候需要展示更小的文字。方法如下&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" co…

【计算机科学】什么是ASCII码?

引言 在计算机技术的世界里&#xff0c;字符编码是一个至关重要的概念&#xff0c;它决定了我们如何将文本字符存储、传输和处理。ASCII码&#xff08;American Standard Code for Information Interchange&#xff0c;美国信息交换标准代码&#xff09;是字符编码中的一项基础…

java关于如何实现读取各种类型的文件核心属性方法,比如获取标题和作者、主题等;附带远程的https的地址文件读取方法;

有两种方法&#xff1a; 通过提供的现成api进行调用读取pdf文件&#xff0c;或doc、xlsx、pptx文件&#xff1b;可能商业需要付费 https://www.e-iceblue.cn/pdf_java_document_operation/set-pdf-document-properties-in-java.html Spire.PDF for Java import com.spire.pdf…

【洛谷】AT_abc188_c [ABC188C] ABC Tournament 的题解

【洛谷】AT_abc188_c [ABC188C] ABC Tournament 的题解 洛谷传送门 AT传送门 Vjudge传送门 题解 谔谔&#xff0c;最近月考&#xff0c;没时间写题解。现在终于有时间了qaq 通过对样例的数据分析我们可以看到。本题的考点就是一个二叉搜索树&#xff0c;因此最简单的方法…

Day31 || 122.买卖股票的最佳时机 II、55. 跳跃游戏、 45.跳跃游戏II 、1005.K次取反后最大化的数组和

122.买卖股票的最佳时机 II 题目链接&#xff1a;力扣题目链接 思路&#xff1a;因为是求虽大利润完全可以假设知道第二天涨前一天买入即可&#xff0c;就是求两天只差大于0 的和。 55. 跳跃游戏 题目链接&#xff1a;力扣题目链接 思路&#xff1a;应该从后往前循环判断&…

搜维尔科技:使用Manus Primel Xsens数据手套直接在Xsens及其插件中捕获手指数据

使用Manus Primel Xsens数据手套直接在Xsens及其插件中捕获手指数据 搜维尔科技&#xff1a;使用Manus Primel Xsens数据手套直接在Xsens及其插件中捕获手指数据

【初识数据库】

目录 一、数据库简介 1.什么是数据库 2.数据库与数据结构有啥关系 3.为什么要使用数据库 二、数据库服务器、数据库和表的关系 三、客户端与服务器的通讯方式 1.C/S架构 2.B/S架构 3.命令提示符 4.MySQL架构 一、数据库简介 1.什么是数据库 组织和保存数据的应用程序…

数据结构与算法JavaScript描述练习------第12章排序算法

1. 使用本章讨论的所有算法对字符串数据而非数字数据进行排序&#xff0c;并比较不同算法的执行 时间。这两者的结果是否一致呢&#xff1f; function CArray(numElements) { this.dataStore []; this.pos 0; this.numElements numElements; this.insert insert; this.toS…

HTTP安全么?如何更好的保护您的网站

在互联网飞速发展的今天&#xff0c;网络安全问题日益严峻。HTTP作为最常见的网络通信协议&#xff0c;虽然在传输效率方面表现优异&#xff0c;但其安全性却常常令人担忧。许多企业和个人网站在使用HTTP进行数据传输时&#xff0c;可能忽视了其中潜在的风险。那么&#xff0c;…

搜维尔科技:SenseGlove Nova 2触觉反馈手套开箱测评

SenseGlove Nova 2触觉反馈手套开箱测评 搜维尔科技&#xff1a;SenseGlove Nova 2触觉反馈手套开箱测评