力扣 27题 移除元素 LeetCode #27 Remove Element

本文介绍了一种使用C++编程语言中的指针技巧,通过遍历数组并判断元素是否等于给定值,将不等于的元素向数组前方移动,最后返回移除元素后的新数组长度。

 解题思路

一句话总概括:把不等同于val的元素往数组前面移动

详细解释:

1. 创建一个pointer 取名为left 用于作为数组的下标

2. 遍历数组的每个元素(也就是for loop),从0下标开始

3. 如果下标i的元素不等于目标值val,那就把此元素写入nums[left],实际上就是把本身再次覆盖

4. 如果i下标元素等于,那就什么也不做,直接跳到i+1元素,以此重复循环到最后一个元素

以下是代码:

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int left; //创建一个pointer 取名为left 用于作为数组的下标
        left=0;
        for(int i=0; i<nums.size();i++) //遍历每个元素
        {
            if(nums[i]!=val) //如果不等于目标值val
            {
                nums[left]=nums[i]; //那么就把元素存入下标为left的相同数组
                left++; //由于存入了元素,所以left下标增加(向右移)
            }
            //如果相等于目标值val,那就不什么也不做,直接增加i的值去遍历下一个元素
        }
        return left;
    }
};

### LeetCode 线性表删除指定元素实现方法 在处理线性表时,删除指定元素是一个常见的需求。以下是基于数组的实现方式,利用双指针法来高效完成这一任务。 #### 方法概述 为了在线性表中删除指定元素并返回新长度,可以采用 **双指针法** 来优化时间复杂度至 O(n),空间复杂度为 O(1)。这种方法的核心在于维护两个指针:一个是慢指针 `slow`,用于记录有效部分;另一个是快指针 `fast`,用于遍历整个数组[^1]。 #### 实现细节 假设输入数组为 `nums`,目标值为 `val`,则可以通过以下步骤实现: 1. 初始化慢指针 `slow = 0` 和快指针 `fast = 0`。 2. 遍历数组,如果当前元素不等于目标值,则将其赋给慢指针位置,并移动慢指针向前一步。 3. 返回慢指针的位置作为新的数组长度。 下面是具体的 Python 实现代码: ```python def removeElement(nums, val): slow = 0 for fast in range(len(nums)): if nums[fast] != val: nums[slow] = nums[fast] slow += 1 return slow ``` 上述代码的时间复杂度为 O(n),因为每个元素最多被访问两次(一次由快指针读取,一次由慢指针写入)。空间复杂度为 O(1),因为我们是在原地修改数组[^2]。 #### 示例分析 假设有如下输入: ```python nums = [3, 2, 2, 3] val = 3 ``` 执行过程如下: - 初始状态:`slow=0`, `fast=0`; - 当 `fast=0` 时,发现 `nums[0]==3`,跳过该步; - 当 `fast=1` 时,发现 `nums[1]!=3`,将 `nums[1]` 赋值到 `nums[slow]` 并增加 `slow` 的值; - 继续此过程直到结束,最终得到 `[2, 2]`,其长度为 2。 #### 特殊情况考虑 需要注意的是,在某些情况下可能需要特殊处理: - 如果数组为空 (`len(nums)==0`),应直接返回 0[^3]。 - 若所有元素均需保留或全部删除,则分别对应于最大和最小的新长度。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值