题目
注意:这里的题目中要求的是元素顺序可以改变。
分析
一般的解决方法是两边循环直接过,属于是暴力求解,但是这里题目要求的时间复杂度是O(n),所以暴力求解直接pass掉。这里采用双指针的方法,即一个指针进行扫描判断(quick),另一个指针进行数组元素的标记(slow)。
代码
int removeElement(int* nums, int numsSize, int val) {
int slow=0;
int quick;
for(quick=0;quick<numsSize;quick++)
{
if(nums[quick]!=val)
{
nums[slow++]=nums[quick];
}
}
return slow;
}
结果展示
官方代码
int removeElement(int* nums, int numsSize, int val) {
int left = 0;
for (int right = 0; right < numsSize; right++) {
if (nums[right] != val) {
nums[left] = nums[right];
left++;
}
}
return left;
}
优化
由于题目说明可以不用管顺序的问题,因此我们可以这样优化:
int removeElement(int* nums, int numsSize, int val) {
int left = 0, right = numsSize;
while (left < right) {
if (nums[left] == val) {
nums[left] = nums[right - 1];
right--;
} else {
left++;
}
}
return left;
}
避免了需要保留的元素的重复赋值操作。