目录
快慢指针法
题目描述. - 力扣(LeetCode):
答案展示:
int removeElement(int* nums, int numsSize, int val) {
int src ,dst;
src = dst = 0;
while(src<numsSize)
{
if(nums[src]!=val)
{
nums[dst] = nums[src];
src++;
dst++;
}
else
src++;
}
return dst;
}
题目讲解:
思路简析:
本题会出现两种思路:
一,额外定义一个数组。但这是不可行的,题目中“你必须仅使用O(1)额外空间,并原地修改输入数组”,O(1)即空间复杂度是一个常数,这里不影响,重点是需要在原数组上修改。
二,使用快慢指针。
过程讲解:
核心思想就是,将值为val的元素通过一前一后的指针,转移到数组的尾部。代码中dst代表慢指针,src代表快指针,只有两种情况:1,当src指向的值为val时,只有src后移,dst不动 2,当src指向的值不为val时,将该值直接赋到dst中,因为这个值是我们想要的,而后两个指针同时后移。
题目反思 :
解决该题最主要的就是将后面的非val数字提到前面来,将值为val的数字提到数组后面去,而体现在代码上就是借助一快一慢的指针这一双无形的手,其实指针在很多时候其本质作用就是“一双手”,所以想出解决方案重要,能将其抽象成代码更重要。