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