给你一个数组nums和一个值val,你需要原地移除所有数值等于val的元素,元素的顺序可能发生改变。然后返回nums中与val不同的元素的数量。
例如:
输入:nums = [3,2,2,3],val = 3;
输出:2,nums=[2,2,_,_]
部分代码:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int left = 0;
int n =nums.size();
for(int right = 0;right <n;right++){
if(nums[right] !=val){
nums[left] = nums[right];
left++;
}
}
return left;
}
};
解释:
-
定义一个
left
指针,初始值为0,用于记录非val
元素的索引。 -
遍历数组
nums
,使用一个right
指针从0开始。 -
如果
nums[right]
不等于val
,则将其赋值给nums[left]
,并将left
指针向前移动一位。 -
继续遍历直到
right
指针到达数组末尾。 -
返回
left
指针的值,即新数组的长度。
复杂度分析:
时间复杂度:O(n),其中n为序列的长度,我们只需要遍历该序列至多两次。
空间复杂度:O(1)。我们只需要常数的空间保存若干变量。