双指针-移除元素

148 阅读1分钟

27. 移除元素

(27. 移除元素 - 力扣(LeetCode))

描述

给你一个数组 nums **和一个值 val,你需要 原地 移除所有数值等于 val **的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

分析

  • 若此题目允许开辟新数组,直接遍历一遍数组,把符合条件的加入即可。时间复杂度和空间复杂度都是O(N)的。
  • 但是此题限制开辟数组,所以必须要在原数组上进行操作。

解法

正解:使用快慢指针
慢指针:记录下一个元素存放的index值。 快指针:用于比较数组元素,若nums[fast++]==val ,则continue。若nums[fast]!=val,则nums[slow++]=nums[fast++]。

时间复杂度O(N),空间复杂度O(1)。

代码

    public int removeElement(int[] nums, int val) {
        int slow = 0;
        for (int fast = 0; fast < nums.length; fast++) {
            if (nums[fast] != val) {
                nums[slow++] = nums[fast];
            }
        }
        return slow;
    }

总结

快慢指针是指针和链表题常用方法,旨在快慢指针各司其职,相互配合,从而得出答案。