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

文章目录

前言

本专栏文章为《代码随想录》书籍的刷题题解以及读书笔记,如有侵权,立即删除。

一、题目

1、原题链接

27. 移除元素

2、题目描述



二、解题报告

1、思路分析

  1. 暴力解法
    利用两层循环 ,第一层循环找到值等于val的元素,第二层循环"移除元素"。(数组移除元素就是将该位置后面的元素依次向前移动一个位置 ,从而达到"移除"的效果,注意移动的顺序:应该从待移动序列前往后依次向前移动,否则会造成数组元素值"丢失")
  2. 双指针法
    设置两个指针,快指针用来遍历数组慢指针用来找到值为val的元素 。具体流程:快指针和慢指针初始指向数组中第一个元素,然后快指针向后遍历数组,当数组元素的值不等于val时,慢指针也向后移动,同时记录该元素在数组中如果数组元素的值等于val时,慢指针不动,快指针继续向后遍历,直到数组元素的值不等于val ,执行前述操作。直至快指针遍历完整个数组。算法结束,此时慢指针正好记录了移除重复元素后的数组长度

2、时间复杂度

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

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

3、代码详解

暴力解法代码

cpp 复制代码
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;
    }
};

双指针法代码

cpp 复制代码
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;
    }
};

三、知识风暴

  • 双指针法
相关推荐
CoderCodingNo41 分钟前
【NOIP】2011真题解析 luogu-P1003 铺地毯 | GESP三、四级以上可练习
算法
iFlyCai1 小时前
C语言中的指针
c语言·数据结构·算法
Laurence1 小时前
C++ 引入第三方库(一):直接引入源文件
开发语言·c++·第三方库·添加·添加库·添加包·源文件
查古穆1 小时前
栈-有效的括号
java·数据结构·算法
再一次等风来1 小时前
近场声全息(NAH)仿真实现:从阵列实值信号到波数域重建
算法·matlab·信号处理·近场声全息·nah
汀、人工智能1 小时前
16 - 高级特性
数据结构·算法·数据库架构·图论·16 - 高级特性
大熊背1 小时前
利用ISP离线模式进行分块LSC校正的方法
人工智能·算法·机器学习
XWalnut2 小时前
LeetCode刷题 day4
算法·leetcode·职场和发展
蒸汽求职2 小时前
机器人软件工程(Robotics SDE):特斯拉Optimus落地引发的嵌入式C++与感知算法人才抢夺战
大数据·c++·算法·职场和发展·机器人·求职招聘·ai-native
charlee442 小时前
最小二乘问题详解17:SFM仿真数据生成
c++·计算机视觉·sfm·数字摄影测量·无人机航测