1、题目描述:
LeetCode链接:移除元素
2、解题方法:
-
双指针(快慢指针),将数组中要移除的元素用后面不等于 val 的元素依次覆盖掉。
-
相当于把不等于 val 的元素找出来,从前往后依次放。
-
时间复杂度:O(N)
-
空间复杂度:O(1)
原数组:
移除元素动图演示如下:
代码如下:
int removeElement(int* nums, int numsSize, int val){
int fast = 0; //指向不等于 val 的元素,用来覆盖要移除的元素
int slow = 0; //指向要移除的元素,等待其被第一个不等于 val 的元素覆盖
while(fast < numsSize)
{
//将数组中不等于 val 的元素依次挪动去覆盖要移除的元素
if (nums[fast] != val)
{
nums[slow] = nums[fast];
slow++;
fast++;
}
else if (nums[fast] == val)
{
//找到了第一个等于val的元素,slow停留
//fast++去找到第一个不等于 val 的元素
fast++;
}
}
return slow; //返回slow走的步数,即数组新长度
}
优化代码如下:我们让 slow 和 fast 同时指向数组首元素,然后让 fast 一直往后走,遍历数组,当发现 nums[fast] != val 时,将这个数拷贝到 slow 指向的位置, slow + 1,这样我们就保证了前 slow 个数就是不重复的数。
int removeElement(int* nums, int numsSize, int val){
//fast和slow指针指向数组首元素
int fast = 0;
int slow = 0;
//fast指针一直往前走
for(fast = 0; fast < numsSize; fast++)
{
//遇到不等于val的元素,放到slow所指向的位置
if(nums[fast] != val)
{
nums[slow] = nums[fast];
slow++;
}
}
//slow指针走的步数即是数组新长度
return slow;
}
大家快去动手试一试吧!