【LeetCode】原地移除数组中数值等于 val 的所有元素(27. 移除元素)| 数组、双指针(快慢指针) | 动图演示

1、题目描述:

image-20210803164453195
image-20210803164530750

LeetCode链接:移除元素


2、解题方法:

  • 双指针(快慢指针),将数组中要移除的元素用后面不等于 val 的元素依次覆盖掉。

  • 相当于把不等于 val 的元素找出来,从前往后依次放。

  • 时间复杂度:O(N)

  • 空间复杂度:O(1)

原数组:

image-20210803175145520

移除元素动图演示如下:

双指针(移除元素)

代码如下:

int removeElement(int* nums, int numsSize, int val){
    int fast = 0;  //指向不等于 val 的元素,用来覆盖要移除的元素
    int slow = 0;  //指向要移除的元素,等待其被第一个不等于 val 的元素覆盖
    while(fast < numsSize)
    {
        //将数组中不等于 val 的元素依次挪动去覆盖要移除的元素
        if (nums[fast] != val)
        {
            nums[slow] = nums[fast];
            slow++;
            fast++;
        }
        else if (nums[fast] == val)
        {
            //找到了第一个等于val的元素,slow停留
            //fast++去找到第一个不等于 val 的元素
            fast++;
        }
    }
    return slow;  //返回slow走的步数,即数组新长度
}

优化代码如下:我们让 slow 和 fast 同时指向数组首元素,然后让 fast 一直往后走,遍历数组,当发现 nums[fast] != val 时,将这个数拷贝到 slow 指向的位置, slow + 1,这样我们就保证了前 slow 个数就是不重复的数。

int removeElement(int* nums, int numsSize, int val){
    //fast和slow指针指向数组首元素
    int fast = 0;
    int slow = 0;
    //fast指针一直往前走
    for(fast = 0; fast < numsSize; fast++)
    {
        //遇到不等于val的元素,放到slow所指向的位置
        if(nums[fast] != val)
        {
            nums[slow] = nums[fast];
            slow++;
        }
    }
    //slow指针走的步数即是数组新长度
    return slow;
}

大家快去动手试一试吧!

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值