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 題目要求
- 給定一個數組 nums 和一個值 val,需要 原地 移除所有數值等於 val 的元素
- 返回移除後數組的新長度
- 不要使用額外的數組空間,你必須僅使用 O(1) 額外空間並 原地 修改輸入數組。
2.2 題目給出的條件
- 一個數組 nums 和一個值 val
- 不需要考慮數組中超出新長度後面的元素。
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 (對應的是數組的下標)
- 最開始p和q都指向第一個元素,然後 判斷 快指針對應的數組的值是否等於 val , 即判斷 nums[p] != val
- 當 滿足 nums[p] != val 的條件時,說明我們可以將後面非 val的值拿到前面,覆蓋掉和val相等的值,
- 最開始 二者都指向 nums[0], 而 nums[0] != val, 這個相當於原地覆蓋,然後 p和 q向前進,直到遇到了 nums[2] = 2的時候, 這個時候q繼續前進,p不動,直到p找到下一個 不等於 val的值,然後將 這個值賦給 慢指針指向的值
- 代碼比較容易理解,建議直接看代碼,懶得畫圖了
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)