移除元素(leetcode 27)

给定一个数组,在数组中删除等于这个目标值的元素,然后返回新数组的大小

数组理论:

数组是一个连续的类型相近的元素的一个集合,数组上的删除是覆盖,只能由后面的元素进行覆盖,而不能进行真正意义上的地理位置删除。

erase()函数:用来删除数组中的某某元素,是一个O(n)的操作。当在一个数组中删除一个元素时,需要将该元素后面的元素整体向前移动,实现一个覆盖的操作。

暴力解题思路:

先用for循环遍历数组找到要删除的目标元素

再使用for循环把目标元素后面的元素一个一个向前覆盖,以实现元素的删除

双指针思路:

使用一个for循环完成暴力解法两个for循环的工作。

定义两个指针,一个快指针(寻找新数组里所需的元素(新数组:删除目标元素之后的数 组)),一个慢指针(新数组的下标值),当快指针指向的元素不等于目标元素时,将快指针获取到的值赋给慢指针。此时慢指针向后移动一位进行更新。当快指针指向的元素等于目标元素时,慢指针不更新,跳过目标元素,实现目标元素的删除。

例:

解题一:暴力穷举法

cpp 复制代码
class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int size = nums.size();
        for(int i = 0;i <size;i++)
        {
            if(nums[i] == val)
            {
                for(int j = i + 1; j < nums.size(); j++)
                    nums[j - 1] = nums[j];
                i--;
                size--;
            }
        }
        return size;
    }
};

解法二:双指针

cpp 复制代码
class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int size = nums.size();
        int slow = 0; 
        for(int fast = 0; fast < size; fast++)
        {
            if(nums[fast] != val)
            {
                nums[slow]=nums[fast];
                slow++;
            }
        }
        return slow;
    }
};
相关推荐
野蛮人6号1 分钟前
力扣热题100道之78子集
算法·leetcode·职场和发展
悦来客栈的老板13 分钟前
AST反混淆实战|reese84_jsvmp反编译前的优化处理
java·前端·javascript·数据库·算法
dragoooon3417 分钟前
[优选算法专题十一.字符串 ——NO.60~63 最长公共前缀、5最长回文子串、 二进制求和 、字符串相乘]
算法·leetcode·动态规划
lengxuenong18 分钟前
第四届挑战赛二轮题解
c++·算法
小毅&Nora22 分钟前
【后端】【C++】函数对象与泛型算法:从“找最便宜的菜”说起
c++·算法·泛型
CoderYanger27 分钟前
C.滑动窗口——2762. 不间断子数组
java·开发语言·数据结构·算法·leetcode·1024程序员节
2401_8370885033 分钟前
Integer.MIN_VALUE 是什么意思?
java·开发语言·算法
好风凭借力,送我上青云35 分钟前
哈夫曼树和哈夫曼编码
c语言·开发语言·数据结构·c++·算法·霍夫曼树
程序员-King.35 分钟前
day118—二分查找—咒语和药水的成功对数(LeetCode-2300)
算法·leetcode·二分查找
小O的算法实验室36 分钟前
2025年COR SCI2区,双种群 NSGA-II 算法+卡车–无人机–调度车辆的多目标应急物资调度,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进