删除数组中的指定元素
删除数组中的某一元素会导致改位置空缺,需要将后面的依次往前移动。如果每删除一个元素就移动一次,时间复杂度较高。下面介绍三种时间复杂度为O(n)算法来进行删除操作及C++代码实现。
一、记录等于x的元素个数
用变量count记录数组中等于x的元素个数,边遍历数组边更新count并且进行前移,然后修改数组长度(使用“&”将修改带回来给实参的length)。
void del_x_1(int arr[],int &length,int x){
int count=0;//等于x的元素个数
for(int i=0;i<length;i++){
if(arr[i]==x){
count++;
}else{
arr[i-count] = arr[i];
}
}
length-=count;
}
二、记录不等于x的元素个数
用变量count记录数组中不等于的元素个数,也是删除后的元素个数,大体思想同上一种方法。因为count记录的信息不同,具体操作也有所不同。
void del_x_2(int arr[],int &length,int x){
int count =0;//不等于x的元素个数
for(int i=0;i<length;i++){
if(arr[i]!=x){
arr[count++] = arr[i];
}
}
length = count;
}
三、划分
利用快速排序划分的思想将数组分为不等于x和等于x的两部分。
void del_x_3(int arr[],int &length,int x){
int i=-1;
for(int j=0;j<length;j++){
if(arr[j]!=x){
i++;
swap(arr[i],arr[j]);//将j位置的元素放到不为x的区域
}
}
length = i+1;
}