LeetCode27.移除元素(双指针例题)
题目
思路
题目给定你一个数组nums和一个值val,需要你输出一个去除了数组中所有值等于val的新数组。因为数组是将类型相同的值存储在一起,并且存储的地址是连续的,所以当我们开始遍历这个数组的时候,每次遇到值等于val的数组元素的时候,需要将该数组元素删除,在数组中执行删除操作其实就是将该值后面的所有元素都向前移动一位,从而使得需要被删除的数组元素被覆盖。
我们可以很容易地想到暴力的做法,也就是两重循环,一重循环用来查找值等于val的数组元素,一重循环用来将该值后面的所有元素都向前移动一位,即删除该元素,可以很轻易的发现时间复杂度为O( n 2 n^2 n2)。
但是我们是可以通过双指针的做法将时间复杂度优化到O(n)的。在我看来,双指针的一个重要作用就是可以将一道题的时间复杂度为O( n 2 n^2 n2)的暴力做法优化到时间复杂度为O(n)。
使用双指针来解决这道题的思路如下:
我们可以使用一个变量fast用来遍历数组,当fast指向值为val的数组元素时,就直接跳过,当fast指向值不为val的数组元素时,我们再设置一个变量slow,执行该代码num[slow++]=nums[fast]
,即使将fast所代表的数组元素的值赋值给slow所代表的数组元素的值。
经过上述的操作,我们可以发现,原来的数组中值为val的数组元素都被跳过,值不为val的数组元素都保留下来的,就满足了题目所要求的。之所以遍历数组元素的变量被设置为fast,是因为它对于数组元素的遍历永远快于slow,所以不用担心nums[slow]的更改会影响到fast遍历数组元素的过程。
代码
class Solution {
public int removeElement(int[] nums, int val) {
int fast=0;
int slow=0;
for(fast=0;fast<nums.length;fast++)
{
if(nums[fast]!=val)
{
nums[slow++]=nums[fast];
}
}
return slow;
}
}