题目
题目链接:
27. 移除元素
思路1–暴力遍历
直接一个循环遍历nums数组每个元素;
再对每个元素判断是否和val相等;
相等就把后面的元素往前移动覆盖它,已达到删除val的目的;
注意:移除元素后,要对数组元素个数-1,numsSize-1;同时,还要对第一层的for循环遍历的i做i–,因为元素移动覆盖时候位置发生变化
时间赋值度O(n2);
代码实现:
int removeElement(int* nums, int numsSize, int val)
{
int temp = numsSize ; //临时保存变量,返回时候要用
int count = 0; //统计移除元素的个数
for(int i = 0;i <numsSize;i++){
if(val == nums[i]){
count++;
for(int j = i;j<numsSize -1;j++){
nums[j] = nums[j+1];
}
numsSize--;
i--; //由于元素都是往前移动了,所以i也要--
}
}
return temp - count;
}
思路2–空间换时间
创建一个临时数组,大小为numsSize;
同时把nums数组中,不等于val的值,移动到临时数组temp中;
然后再把temp的值覆盖回去nums中;
时间复杂度O(n);
空间复杂度O(n);
实现代码:
int removeElement(int* nums, int numsSize, int val)
{
int *temp = (int*)malloc(sizeof(int)*numsSize);
int j = 0;//执行临时数组的下标
//找不等于val的值放到临时数组
for(int i = 0;i<numsSize;i++){
if(val != nums[i]){
temp[j++] = nums[i];
}
}
//把临时数组的值,覆盖回去
//上面的循环结束后,j = 不是val元素的个数
for(int i = 0;i<j;i++){
nums[i] = temp[i];
}
return j;
}
思路3–双指针
定义两个指针:一个dst,一个src;
dst表示目的地指针,src是源指针,src用来移动寻找不等于val的值;
src找到不等于val的值那么就把它赋值给dst对应的值,即nums[dst] = nums[src],同时dst++;src++;
src碰到于val相等的值,那么src++;其他不变;
时间赋值度O(n);
空间复杂度度O(1);
实现代码:
int removeElement(int* nums, int numsSize, int val)
{
int dst = 0;
int src = 0;
while(src < numsSize){
if(nums[src] !=val){
nums[dst++] = nums[src++];
}else{
src++;
}
}
//当退出循环后,dst就是元素个数