27. 移除元素

移动交换

解题思路

  1. 首先初始化两个指针 slowfast 指向数组的第一项;

    • slow 遇到 val 停下;
    • fast 会一直向后面移动;
    • nums[slow] === val && nums[fast] !== val 的时候,交换 slowfast 处的值;
  2. 重复以上的步骤,直到 fast 指针走到数组最后一位结束,返回 slow 即可;

图解

复杂度

  1. 时间复杂度:O(n)

  2. 空间复杂度:O(1)

代码实现

var removeElement = function (nums, val) {
    let slow = 0;
    let fast = 0;

    while (slow <= fast && fast < nums.length) {
        // 左指针为 val 且 右指针不为 val => 交换位置(val 被放到了后面)
        if (nums[fast] !== val && nums[slow] === val) {
            [nums[slow], nums[fast]] = [nums[fast], nums[slow]];
        }

        // left、right 指针一直向右走,找到第一个 val 的位置,右指针向右走,左指针停下
        if (nums[slow] !== val) {
            slow++;
        }

        fast++;
    }

    return slow;
};

移动复制

解题思路

  1. 遍历数组,把 非 val 元素从数组第一项开始替换;

  2. 遍历结束后替换到了 inx 项,直接返回 inx

图解

复杂度

  1. 时间复杂度:O(n)

  2. 空间复杂度:O(1)

代码实现

var removeElement = function (nums, val) {
    let inx = 0;

    for (let index = 0; index < nums.length; index++) {
        const el = nums[index];
        if (el !== val) {
            nums[inx++] = el;
        }
    }

    return inx;
};

参考资料

  1. 卡尔:《代码随想录》

打赏作者
您的打赏是我前进的动力
微信
支付宝
评论

中午好👏🏻,我是 ✍🏻   疯狂 codding 中...

粽子

这有关于前端开发的技术文档和你分享。

相信你可以在这里找到对你有用的知识和教程。

了解更多

目录

  1. 1. 移动交换
    1. 1.1. 解题思路
    2. 1.2. 图解
    3. 1.3. 复杂度
    4. 1.4. 代码实现
  2. 2. 移动复制
    1. 2.1. 解题思路
    2. 2.2. 图解
    3. 2.3. 复杂度
    4. 2.4. 代码实现
  3. 3. 参考资料