24年1月7日LeetCode刷题题目解法及心得-移除元素

        今天写的是leetcode 26.移除元素。题目如下

        意在我们删除有所有等于val的元素,并且再O(1)的空间复杂度中完成,原地修改,并且返回新数组的长度。

这道题有三个思路:

思路一:遍历数组

        遍历数组,找到和val相等的元素,并且把后面的元素向前移动一个位置,由于找到一个需要将后面所有的元素向前移动一个元素,所以最坏时间复杂度为O(n^2),这对计算机造成很大负担。

思路二:新建一个临时数组,把不等于val的元素存入到新数组中

        先要遍历数组,找到与val不同的元素,就把该元素赋值给新数组的下标为i的元素,最后返回新数组的元素个数。但是这需要开辟一个新数组的内存空间,最坏空间复杂度为O(n),不合题意。

        这时我们就在思考,怎么让代码的时间复杂度为O(n),空间复杂度为O(1)呢?

思路三:双指针(最优解)

        我们可以定义两个指针,两个指针都从数组的下标0开始。同时为了不越界,就把while中的条件设为src < numsSize。如果nums[src] != val,就把nums[src]赋值给nums[dst]。如果不等于,那么src++,dst则不用++。dst是新数组的元素数量,返回dst即可。

以下是思路三的代码:

int removeElement(int* nums, int numsSize, int val)
{
    int dst = 0;
    int src = 0;
    while(src < numsSize)
    {
        if(nums[src] != val)
        {
            nums[dst] = nums[src];
            src++;
            dst++;
        }
        else
            src++;
    }
    return dst;
}

启发:c语言的一大利器就是可以操作指针,那么如果用双指针解决一个问题,那是再好不过的事情,可是得到思路三也不能没有思路一和思路二的铺垫。

  • 13
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值