数组元素删除--快慢指针法学习

文章介绍了LeetCode第27题的两种解法。一是暴力解法,通过两次遍历数组来移除指定元素,时间复杂度为O(n^2)。二是使用快慢指针法,在单次遍历中完成元素移动,降低时间复杂度到O(n)。快慢指针法中,快指针用于扫描数组,慢指针则用于构建新的有效数组。
摘要由CSDN通过智能技术生成

力扣题目27:移除元素

数组元素删除其实就是将不需要的元素用其他元素进行覆盖。并不存在真正的删除操作,因为元素存储的空间是连续的。

解法一:暴力解法

采用暴力解法,进行两次遍历;第一次遍历寻找需要删除的元素,第二次遍历将后边元素前移,将要删除的元素进行覆盖操作。

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        //暴力解法,两次遍历,第一次找val,第二次更新
        int size = nums.size();
        for(int i = 0; i<size; i++){
            if(nums[i]==val){
                for(int j = i+1; j<size; j++){
                    nums[j-1] = nums[j];
                }
                size--;
                i--;
                }
            }
            return size;
        }      
};

显然,暴力解法的时间复杂度为O(n^2)

解法二:快慢指针法

通过一个快指针和慢指针在一个for循环内完成暴力解法中两个for循环的工作。

移除元素的过程如上图所示。

快指针和慢指针其实都是指向同一个数组的;不过快指针指向的数组可以抽象的理解为当前需要操作的数组,而慢指针是满足要求的元素组成的数组,也就是当当前元素不是要删除的元素时,将该元素赋给慢指针所指的数组。当循环完成时,慢指针所指向的数组下标也就是新数组的大小。

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        //快慢指针法
        int slowP = 0;
        for(int fastP = 0;fastP<nums.size();fastP++){
            if(nums[fastP]!=val){
                nums[slowP]=nums[fastP];
                slowP++;
            }
        }
        return slowP;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值