【C/C++练习】经典的快慢指针问题---移除元素

news2024/11/19 10:20:05

在这里插入图片描述

📖题目描述

在这里插入图片描述
题目出处:移除元素

🔖示例

在这里插入图片描述

📖题解

 对于本题我将按照由易到难的顺序为大家分享三种解题思路,并逐一分析它们的优劣,以及注意事项。

🔖思路一:暴力求解

 我想暴力求解应该是第一次接触到此题的小伙伴们最先想出来的办法吧。这道题目暴力求解就是去遍历数组,当遇到数组元素等于val的时候,将后面的所有元素往前挪动一位,把val覆盖掉以实现移除的效果。具体过程如下动图所演示:
在这里插入图片描述
代码实现:

int removeElement(int* nums, int numsSize, int val)
{
    int i = 0;
    int len = numsSize;
    while(i < len)
    //循环控制变量用len,因为如果有重复,就会往前覆盖
    {
        if (nums[i] == val)
        {
            int j = 0;
            for (j = i; j < len; j++)
            //把后面的往前覆盖
            {
                if (j != numsSize - 1)
                {
                    nums[j] = nums[j + 1];
                }
            }
            len--;
            //找到一个之后跳出循环,继续从下标为0的数字开始检查
            }
        else
        {
            i++;
        }
    }
    return len;
}

 需要注意:i是用来遍历整个数组的,当nums[i] == val的时候停下来,把i后面的所有数据往前挪动一位,且数组的有效长度len减一。挪动完后i的值不变,因为此时i位置上的元素是它后一位经过挪动覆盖过来的,我们并不知道他是否等于val,因此需要继续判断num[i]是否等于val,如果不等于再让i++继续去遍历后面的元素,直到i等于数组的有效长度,此时说明已经遍历结束。

复杂度分析:
 时间复杂度要讨论最坏的情况,对于本题最坏情况就是数组中所有的元素都等于val,假设数组一共有 N N N个元素,那么将第一个元素移除需要把后面的 N − 1 N-1 N1个元素全部往前挪动一位,也就是挪动 N − 1 N-1 N1次,由于数组元素全是val所以经过挪动后第一个元素任然是val,但此时数组的有效元素个数已经变成了 N − 1 N-1 N1,所以此时需要挪动 N − 2 N-2 N2…以此类推总的挪动次数就是一个等差数列求和,因此时间复杂度就是 O ( N 2 ) O(N^2) O(N2)

🔖思路二:空间换时间

 如果对空间复杂度没有要求的情况下,我们可以创建一个新数组,然后去遍历原数组,如果num[i]不等于val就把他拷贝到新数组,如果等于那就跳过并且有效数据个数减一,直到遍历结束,然后把新开数组的内容拷贝回原数组。具体过程如下动图所示:
在这里插入图片描述
代码实现:

int removeElement(int* nums, int numsSize, int val)
{
    int len = 0;
    int* tmp = (int*)malloc(sizeof(int)*numsSize);
    for(int i = 0; i < numsSize; i++)
    {
        if(nums[i] != val)
        {
            tmp[len++] = nums[i]; 
        }
    }
    memcpy(nums, tmp, sizeof(int)*len);
    return len;
}

复杂度分析:
 时间复杂度方面,这种方案只遍历了一遍数组,因此它的时间复杂度是 O ( N ) O(N) O(N),在空间复杂度方面,由于开辟了一个新数组,所以空间复杂度是 O ( N ) O(N) O(N)

🔖思路三:双指针

 这种思路的具体过程是:同时维护两个指针,分别记作pripos,让他俩从第一个元素开始同时往后走,当pos指向的元素不等于val的时候,把其赋值给pri所指向的位置,然后两个指针继续往后走,如果pos指向的元素等于val,那么pri停下来,pos跳过这个元素继续往后走,直到pos指向的元素不等于val,把它赋值给pri指向的位置,然后两个指针继续同时往后走,直到pos指针来到数组的结尾。具体过程如下动图所示:
在这里插入图片描述

int removeElement(int* nums, int numsSize, int val)
{
    int pri = 0, pos = 0;
    while(pos < numsSize)
    {
        if(nums[pos] != val)
        {
            nums[pri] = nums[pos];
            pri++;
        }
        pos++;
    }
    return pri;
}

复杂度分析:
 在时间复杂度方面,这种方法只遍历了一遍数组,所以时间复杂度是 O ( N ) O(N) O(N),在空间复杂度方面,由于没有额外申请空间所以空间复杂度是 O ( 1 ) O(1) O(1)。对于这道题思路三无疑是最好的方法,这种快慢指针的思想大家要多多去体会。


在这里插入图片描述

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

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

相关文章

零-云尚办公项目学习

对于云尚办公项目的学习 1、这是尚硅谷推出的新的OA项目 云尚办公系统是一套自动办公系统&#xff0c;系统主要包含&#xff1a;管理端和员工端 管理端包含:权限管理、审批管理、公众号菜单管理 员工端:采用微信公众号操作&#xff0c;包含&#xff1a;办公审批、微信授权登…

数字通信中的编码(学习笔记)

编码种类 RZ(Return Zero Code)编码 也称为归零码&#xff0c;就是在 一个周期内&#xff0c;用二进制传输数据位&#xff0c;在数据脉冲结束后&#xff0c;需要维持一段时间的低电平。 RZ编码又分为两种&#xff1a; 单极性归零码 低电平表示0&#xff0c;正电平表示1&…

【Java用法】windows10系统下修改jar中的文件并重新打包成jar文件然后运行

windows10系统下修改jar中的文件并重新打包成jar文件然后运行 一、背景描述二、操作步骤2.1 解压jar包2.2 修改配置文件2.3 重新打成jar包2.4 确认是否修改成功2.5 运行程序 一、背景描述 测试环境&#xff08;Linux&#xff09;的代码&#xff08;jar包&#xff09;拉取到本地…

AI数字人:语音驱动面部模型及超分辨率重建Wav2Lip-HD

1 Wav2Lip-HD项目介绍 数字人打造中语音驱动人脸和超分辨率重建两种必备的模型&#xff0c;它们被用于实现数字人的语音和图像方面的功能。通过Wav2Lip-HD项目可以快速使用这两种模型&#xff0c;完成高清数字人形象的打造。 项目代码地址&#xff1a;github地址 1.1…

可再生能源与能源存储技术的结合和互补

在全球对可再生能源的需求日益增长的背景下&#xff0c;如何将可再生能源与能源存储技术相结合&#xff0c;实现能源的高效利用和持续供应成为了一个重要的议题。本文将探讨可再生能源与能源存储技术的结合与互补关系&#xff0c;分析其对能源领域的影响以及未来发展的前景。 …

CSS常用样式

文章目录 字体样式文本样式颜色和背景样式对齐方式下划线、上划线、删除线设置行高 列表样式背景样式背景颜色背景图片背景重复背景大小 鼠标样式伪类样式设置透明度 字体样式 所有样式都写在<style>标签内&#xff0c;里面加选择器 <!DOCTYPE html> <html>…

别小看可拖拽式表单设计器,降本增效就靠它啦!

在经济快速发展的当下&#xff0c;办公已然进入流程化发展阶段。不少企业希望实现降本增效的办公效果&#xff0c;大家不妨可以了解下可拖拽式表单设计器。通过简单的拖拉拽就能实现应用组建&#xff0c;创建属于自己的快速开发框架平台&#xff0c;不仅省下培养专业程序人工的…

安科瑞电化学储能电能管理系统解决方案

1.概述 在我国新型电力系统中&#xff0c;新能源装机容量逐年提高&#xff0c;但是新能源比如光伏发电、风力发电是不稳定的能源&#xff0c;所以要维持电网稳定&#xff0c;促进新能源发电的消纳&#xff0c;储能将成为至关重要的一环&#xff0c;是分布式光伏、风电等新能源…

抖音本地生活团购软件开发

抖音本地生活团购软件开发需要考虑以下几个方面&#xff1a; 功能设计&#xff1a;根据本地生活团购服务特点&#xff0c;设计相应的功能模块&#xff0c;如商家入驻、商品展示、订单管理、支付等。 技术选型&#xff1a;选择适合该项目的技术和框架&#xff0c;如移动…

【MySQL经典练习题】1. 多列数据求最大值

用 SQL 从多行数据里选出最大值或最小值很容易——通过 GROUP BY 子句对合适的列进行聚合操作&#xff0c;并使用 MAX 或 MIN 聚合函数就可以求出。 那么&#xff0c;从多列数据里选出最大值该怎么做呢&#xff1f; 目录 1、建表SQL 2、查询SQL &#xff08;1&…

LabVIEW开发汽车装配挡风玻璃清洗机灌装机

LabVIEW开发汽车装配挡风玻璃清洗机灌装机 挡风玻璃清洗机灌装机用于填充车内的肥皂槽。该项目在汽车行业实施。可编程逻辑控制器用于许多类型的行业&#xff0c;它使系统灵活。以前使用继电器逻辑&#xff0c;但由于其局限性&#xff0c;用PLC代替了。PLC用于模拟和数字逻辑信…

Thymeleaf介绍及其在Spring Boot中的使用

&#x1f4d6; Thymeleaf简介 &#x1f4da; Thymeleaf的定义 Thymeleaf 是一款现代化的服务器端 Java 模板引擎&#xff0c;适用于 Web 和独立应用场景。它具备处理 HTML、XML、JavaScript、CSS 以及纯文本的能力。Thymeleaf 的核心目标是为开发者提供一种优雅且自然的模板设…

vue 图片上传到腾讯云对象存储组件封装(完善版)

vue 上传图片到腾讯云对象存储 1、 引入cos-js-sdk-v52、封装uploadcos.js3、封装图片上传组件、调用上传方法4、页面使用组件 之前总结过 vue 封装图片上传组件到腾讯云对象存储&#xff0c;后来又加了一些功能&#xff0c;在图片过大时进行压缩&#xff0c;压缩完成之后&…

基于NXP i.MX 6ULL——MQTT通信协议的开发案例

前 言 本指导文档适用开发环境&#xff1a; Windows开发环境&#xff1a;Windows 7 64bit、Windows 10 64bit Linux开发环境&#xff1a;Ubuntu 18.04.4 64bit 拟机&#xff1a;VMware15.1.0 U-Boot&#xff1a;U-Boot-2020.04 Kernel&#xff1a;Linux-5.4.70 Linux S…

深入理解ThreadPoolExecutor线程池工作原理源码解析

文章目录 0. 前言1. 生命周期管理1.1 创建1.2 执行1.2.1 任务执行入口1.2.2 addWorker解析1.2.3 Worker类解析 1.3 关闭1.4 终止阶段 2. 总结 0. 前言 背景&#xff1a;最近技术交流群里有个新同学&#xff0c;面试的时候被问到线程池相关的问题&#xff0c;答的不是很好&#…

LinkedIn领英如何创建公司主页?附领英产品专区创建方法

领英常见问题-如何创建公司主页&#xff1f; 领英不仅可以创建个人主页&#xff0c;还可以以企业的身份创建公司主页。 公司主页就相当于自己的官网&#xff0c;可以发布动态&#xff0c;展示公司信息&#xff0c;做官网外链&#xff0c;对公司来讲也是一种品牌形象宣传&…

PDF转换软件有哪些?分享免费好用的PDF转换工具!

PDF是在办公和学习中常用的文件格式&#xff0c;它包含文字、图片、数据等各种信息&#xff0c;可以说是功能丰富。然而&#xff0c;有时我们需要将PDF转换为PPT格式以便于演示&#xff0c;或者将其转换为Word格式以节省内存空间。这时候就需要使用PDF转换软件。下面我将介绍一…

20230618_ISP-pipeline-hdrplus_contrast

原理&#xff1a; global映射曲线&#xff0c;通过这个曲线控制黑的更黑&#xff0c;白的更白 b&#xff1a;黑电平 s&#xff1a;强度&#xff0c;值越大越接近yx&#xff1b;越小对比度越强 代码&#xff1a; 简单的映射表&#xff0c;没什么好讲的 效果&#xff1a; before&…

【Spring】设计思想

一、Spring 是什么&#xff1f; Spring是一个开源的Java框架&#xff0c;有着活跃而庞大的社区&#xff08;例如&#xff1a;Apache&#xff09;&#xff0c;Spring 提供了一系列的工具和库&#xff0c;可以帮助开发者构建高效、可靠、易于维护的企业级应用程序。Spring的核心…

jupyter插件nbextensions及Anaconda安装nbextensions

安装nbextensions 以管理员身份运行Anaconda Prompt&#xff0c;依次敲以下命令 用清华源安装 pip install jupyter_contrib_nbextensions -i https://pypi.tuna.tsinghua.edu.cn/simple pip install jupyter_nbextensions_configurator -i https://pypi.tuna.tsinghua.edu.cn…