leetcode - 27. 移除元素

1. 题目

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

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

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

示例 1:

给定 nums = [3,2,2,3], val = 3,

函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。

你不需要考虑数组中超出新长度后面的元素。
示例 2:

给定 nums = [0,1,2,2,3,0,4,2], val = 2,

函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。

注意这五个元素可为任意顺序。

你不需要考虑数组中超出新长度后面的元素。

来源:传送门

2. 解题思路

2.1 题目要求

  1. 给定一个数组 nums 和一个值 val,需要 原地 移除所有数值等于 val 的元素
  2. 返回移除后数组的新长度
  3. 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。

2.2 题目给出的条件

  1. 一个数组 nums 和一个值 val
  2. 不需要考虑数组中超出新长度后面的元素。

2.3

示例 1:

给定 nums = [3,2,2,3], val = 3,

函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。

2.3 我的思路

这个思路很简单,有点类似于 leeetcode - 26. 删除排序数组中的重复项
使用快慢指针,覆盖掉非 val 的数,这里我举例说明 :
题目 :nums = [0,1,2,2,3,0,4,2], val = 2,
定义一个慢指针 p = 0, 快指针 q=0 (对应的是数组的下标)

  1. 最开始p和q都指向第一个元素,然后 判断 快指针对应的数组的值是否等于 val , 即判断 nums[p] != val
  2. 当 满足 nums[p] != val 的条件时,说明我们可以将后面非 val的值拿到前面,覆盖掉和val相等的值,
  3. 最开始 二者都指向 nums[0], 而 nums[0] != val, 这个相当于原地覆盖,然后 p和 q向前进,直到遇到了 nums[2] = 2的时候, 这个时候q继续前进,p不动,直到p找到下一个 不等于 val的值,然后将 这个值赋给 慢指针指向的值
  4. 代码比较容易理解,建议直接看代码,懒得画图了

3. 代码

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        if(nums.empty()){
            return 0;
        }
        int slow = 0;
        for(int j = 0; j < nums.size();j++){
            if(nums[j] != val){
                nums[slow] = nums[j];
                slow++;
            }
        }
        return slow;
    }
};

贴个图 , 时间复杂度是 O(n) 空间复杂度是 O(1)
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章