所学习的东西要去实践,不然只是你以为你会了。
一.原题如下
给你一个数组 nums 和一个值 val,你需要原地移除所有数值等于val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
二.示例如下
四.分析与图示
根据题意,依旧采用快慢双指针。起初让两个指针都指向数组第一个元素的位置,如果快指针所指示的位置元素同val值相等,则让fast++,否则将fast所指示的数组元素,赋值给slow所指示的数组元素,同时slow++后,再fast++…。用图示描述如下:
不需要移除,两者同时移动,如下:
同理:
此时fast所指示的元素需要被覆盖,则只需要Fast移动,slow不动,如下:
同理:
上述图示中,fast所指示的数据元素同val不相等,则需要将其移动到slow所指示的位置上,即赋值给slow,赋值后slow指向下一个位置,fast指向下一个位置,如下:
最终结果,如下:
fast的值不小于数组元素个数,循环结束,最终slow的值就是新数组元素的数组元素个数。
五.代码实现
//C实现
int removeElement(int* nums, int numsSize, int val){
int slow=0;//慢指针
int fast=0;//快指针
while(fast<numsSize)
{
if(nums[fast]!=val)
{
nums[slow]=nums[fast];
slow++;
}
fast++;
}
return slow;
}
//C++实现
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slow=0;
int fast=0;
while(fast<nums.size())
{
if(nums[fast]!=val)
{
nums[slow]=nums[fast];
slow++;
}
fast++;
}
return slow;
}
我是老胡,又是充实的一天!❤️ ❤️
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)