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)
在這裏插入圖片描述

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