题目:给你一个数组 nums
和一个值 val
,你需要 原地 移除所有数值等于 val
的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1)
额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
核心思路:
双指针:右指针指向当前将要处理的元素,左指针指向下一个将要赋值的位置。
Python:
class Solution(object): # 非官方题解def removeElement(self, nums, val):count = 0i = 0for j in range(len(nums)):if nums[i]==val:count=count+1if i != len(nums)-1:nums[i:len(nums)-1]=nums[i+1:]nums[-1]=valelse:i=i+1return (len(nums)-count)
C++:
class Solution {
public:int removeElement(vector<int>& nums, int val) {int n = nums.size();int left = 0;for (int right = 0; right < n; right++) {if (nums[right] != val) {nums[left] = nums[right];left++;}}return left;}
};
class Solution { # optimized
public: # 双指针分别位于首尾 重合时遍历完所有元素int removeElement(vector<int>& nums, int val) {int left = 0, right = nums.size();while (left < right) {if (nums[left] == val) {nums[left] = nums[right - 1];right--;} else {left++;}}return left;}
};