移动元素(快慢指针法)

移动元素(快慢指针法)_第1张图片

 移动元素(快慢指针法)_第2张图片

 本题运用了快慢指针法来解决,实际上并没有创建指针,而是创建了两个变量模拟下标的走势:
移动元素(快慢指针法)_第3张图片

 两个变量的规则是:

str是快指针,dst是慢指针,str遍历数组,dst用于改变数组的值和返回非val的个数;

如果str指向的值等于val,str++;

如果str指向的值不等于val,就使nums[dst] = nums[str],然后str++,dst++;

直到str不再小于numsSize,即str等于numsSize,超出了nums的下标范围,结束str的遍历;

这样做的目的是,str遇到val值时,会直接跳过,dst将在原地待命,直到str后面遇到非val值时,再用dst将其覆盖,最终str遍历完毕,dst即为非val值的个数,由于dst <= numsSize,所以返回dst后可以根据dst创建循环的判断条件,打印出把val值覆盖之后的数组。

移动元素(快慢指针法)_第4张图片

 

int removeElement(int* nums, int numsSize, int val) {
    int str = 0;
    int dst = 0;
    while(str < numSize)
    {
        if(nums[str] == val)
        {
            str++;
        }
        else
        {
            nums[dst++] = nums[str++];
        }
    }
    return dst;
}

你可能感兴趣的:(算法,数据结构,算法,c++,c语言)