本篇博客由CSDN@先搞面包再谈爱原创,转载请标注清楚,请勿抄袭。
题目描述:
题目示例:
题目提示
题目所给接口:
int removeElement(int* nums, int numsSize, int val)
解法
首先我们先看看题目的描述中有哪些基本的要求和提示:
- 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
- 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
根据第一个我们可以知道不能创建额外的数组;
那么有几种解法呢?
解法一(暴力)
挨个遍历数组,如果遇到某元素和val相同了,就直接将后方的元素往前挪动,这样的时间复杂度就是O(N^2)了,不是好的解法。
解法二(双指针)
其实不是真正意义上的双指针,只是用下表来代替。
定义一个i,一个j。同时从头开始走
如果j位置处的元素不等于val,就把j位置处的值放到i位置处(如果i和j相等,则放不放都一样),然后i++,j++,并记录下当前i位置之前有多少个元素。
如果j位置处的元素等于val,就什么也不做,只让j++。
以此类推,直到j越界就停止。
这样的话时间复杂度就是O(N)的。
图示:
代码:
int removeElement(int* nums, int numsSize, int val)
{
int i = 0;
int j = 0;
int count = 0;
while(j < numsSize)
{
while(j < numsSize && nums[j] == val)
{
j++;
}
while(j < numsSize && nums[j] != val)
{
nums[i++] = nums[j++];
count++;
}
}
return count;
}