每日一题——移除元素

每日一题

移除元素

题目链接

在这里插入图片描述

思路

  • 题目没有规定时间复杂度,那么我们最容易想到的方法肯定是利用两层for循环来解决问题
    • 即遍历数组,如果数组元素等于val,那就将这个元素后面的元素往前移,将这个值为val的元素覆盖
    • 这样的暴力解法的时间复杂度为O(n2)
  • 那这题可不可以缩短时间,使时间复杂度为O(n)呢?当然可以,这里我们就需要用到双指针中的快慢指针思想
    • 定义快指针fast,用来遍历整个数组,慢指针slow用来确定新数组(即删除值为val元素后·数组)的下标,并都初始化为0
    • 当nums[fast]不为val时,那就使nums[slow]的值为nums[fast],同时slow++,相当于保留数组元素
    • 当nums[fast]等于val时,那就使fast继续遍历,而slow不变,相当于删除了值为val的元素
      在这里插入图片描述

实现代码

方法一
int removeElement(int* nums, int numsSize, int val){
    int i,j;
    for(i=0;i<numsSize;i++)
    {
        if(nums[i] == val)
        {
            for(j=i+1;j<numsSize;j++)
                nums[j-1] = nums[j];
            numsSize--;	//数组大小减一
            i--;	//由于后面的元素往前覆盖了一个位置,因此i要向前走一个
        }
    }
    return numsSize;
}
方法二(快慢指针)
int removeElement(int* nums, int numsSize, int val){
    int fast,slow = 0;
    for(fast = 0; fast < numsSize; fast++)
    {
        if(nums[fast] != val)
            nums[slow++] = nums[fast];
    }
    return slow;
}

ps:快慢指针的动态图来自《代码随想录》——https://programmercarl.com/

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Forward♞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值