一、移除元素
题目:
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
注意:这里的移除并不是“删除”,而是“覆盖”。(数组中的的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖)
解法一:暴力解法(逐个判断) 【就是从头开始,找到目标元素val,就执行一次任意位置删除】
#include<assert.h>
void Erase(int* nums, int pos, int length)
{
assert(length > 0);
while (pos < length - 1)
{
nums[pos] = nums[pos + 1];
pos++;
}
int removeElement(int* nums, int numsSize, int val)
{
assert(nums);
int i = 0;
int length = numsSize;
for (i = 0; i < numsSize; i++)
{
if (nums[i] == val)
{
Erase(nums, i, numsSize--);
i--;
length--;
}
}
return length;
}
解法二:双指针法 【通过一个快指针和慢指针在一个for循环下完成两个for循环的工作】
快指针和慢指针的初始位置一致。遍历整个数组,两个指针所指向的值进行比较。
int removeElement(int* nums, int numsSize, int val)
{
int slow = 0;
for(int fast = 0; fast < numsSize; fast++)
{
if(nums[fast] != val)
{
nums[slow++] = nums[fast];
}
}
return slow;
}
总结:本题的解法还有很多,本人对本题的理解有待提高,大家多指点!
本文介绍了如何在给定数组中移除所有等于特定值的元素,同时保持O(1)额外空间。提供了两种方法:暴力解法逐个判断和双指针法,后者通过合并遍历来提高效率。
883





