【代码随想录】LC 27. 移除元素

简介: 利用两层循环,第一层循环找到值等于val的元素,第二层循环“移除元素”。(数组移除元素就是将该位置后面的元素依次向前移动一个位置,从而达到“移除”的效果,注意移动的顺序:应该从待移动序列前往后依次向前移动,否则会造成数组元素值“丢失”)

一、题目

1、原题链接

27. 移除元素


2、题目描述

575a69b20dc9abd3eae56f4cada0c876_b03ea5145d9a44229ecb2670196a259d.png

d8f31f32a69dea0182e9f78992749247_86a39ba8a7eb4525aa1cf3417f3f36c8.png

f7bba49871f612ddb406025f5b008901_9c13941014d8460e988aace747de4619.png


二、解题报告

1、思路分析

暴力解法

利用两层循环,第一层循环找到值等于val的元素,第二层循环“移除元素”。(数组移除元素就是将该位置后面的元素依次向前移动一个位置,从而达到“移除”的效果,注意移动的顺序:应该从待移动序列前往后依次向前移动,否则会造成数组元素值“丢失”)

双指针法

设置两个指针,快指针用来遍历数组,慢指针用来找到值为val的元素。具体流程:快指针和慢指针初始指向数组中第一个元素,然后快指针向后遍历数组,当数组元素的值不等于val时,慢指针也向后移动,同时记录该元素在数组中;如果数组元素的值等于val时,慢指针不动,快指针继续向后遍历,直到数组元素的值不等于val时,执行前述操作。直至快指针遍历完整个数组。算法结束,此时慢指针正好记录了移除重复元素后的数组长度。

2、时间复杂度

暴力解法时间复杂度O(n^2)

双指针法时间复杂度O(n)


3、代码详解

暴力解法代码


class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int cnt = nums.size(); 
        //注意循环条件i<cnt,不要写成i<nums.size()造成错误   
        for (int i = 0; i < cnt; i++) {
            if (nums[i] == val) {
                //“移除”过程:i位置后的所有元素向前移动一个位置
                for (int j = i + 1; j < cnt; j++) {
                    nums[j-1] = nums[j];
                }
                cnt--;
                //i后面元素都向前移动了一个位置,i也向前移动一个位置
                //下一次循环时相当于i没有动,而元素向前移动了一个位置
                //i也就指向了下一个需要遍历的数组元素
                i--;
            }
        }
        return cnt;
    }
};


双指针法代码

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int slowPoint=0;
        //快指针遍历数组
        for (int fastPoint = 0; fastPoint < nums.size(); fastPoint++) {
            //慢指针记录结果:只记录值不为val的所有元素
            if (nums[fastPoint] != val) {
                nums[slowPoint++]=nums[fastPoint];
            }
        }
        //此时slowPoint正好记录了移除重复元素后的数组元素个数
        return slowPoint;
    }
};


三、知识风暴

双指针法

目录
相关文章
32activiti - 排他网关(ExclusiveGateWay)
32activiti - 排他网关(ExclusiveGateWay)
189 0
|
算法 API 图形学
【Qt 学习笔记】QWidget的geometry属性及window frame的影响
【Qt 学习笔记】QWidget的geometry属性及window frame的影响
886 2
[1] 理论一:吸收能力理论
[1] 理论一:吸收能力理论
422 1
|
机器学习/深度学习 自然语言处理 Python
|
SQL 分布式计算 Apache
《Hivemall Scalable machine learning library for Apache HiveSparkPig》电子版地址
Hivemall: Scalable machine learning library for Apache Hive/Spark/Pig
《Hivemall Scalable machine learning library for Apache HiveSparkPig》电子版地址
|
算法 搜索推荐
每日训练(二)
每日训练(二),题目来源:力扣,PTA。
每日训练(二)
|
前端开发 Java Maven
SpringBoot2核心功能--Web开发
SpringBoot2核心功能--Web开发
169 0
|
存储 JSON 数据格式
五分钟拿捏Python字典-Python3入门必备[字典详细操作]
在上一篇文章《Python3 详细的数组基础操作 - 入门必备 [列表的操作]》中讲解了Python的列表操作,这次接着唠唠Python数组中的字典,字典是Python的另一种可变容器模型,且可存储任意类型对象。他也是Python项目开发中最常用的数据类型之一,他的格式有点像json,但又不是json,不过在实际的开发中字典和json的相互转换是日常操作,比如我们平时调用第三接口,接口一般返回的是json格式的数据,将接口返回的json数据转化为字典,更方便我们在Python中使用。 字典就像他们的名字一样,我们知道关键字或者说索引就可以在字典里找到与关键字匹配的更多详细信息。字典在Pyth
235 1
|
Web App开发 Java 数据安全/隐私保护