删除数组中值为k的所有元素
算法设计思路:
需要查找数组中所有的元素,所以我们从空间复杂度评价算法的优劣:
设置相同元素的个数计数变量,num即相同元素出现的次数,初始值为0,因为数组是顺序表,每个元素需要连接起来,所以相同的元素的出现次数即所有元素的移动次数。
设相同的元素为k,则开始比较,若出现与k相同的元素,num++,继续遍历出现的元素和k不同,将该元素向前移动num位。直到遍历结束。最后将原数组从num位到数组最后一位置为NULL。结束。
实现:
void DeleteSqList(SqList &L, int ElemType k){
int num = 0;
for(int i = 0; i < L.length; i++){
if(L.data[i] == k)num++;//如果相等,后续元素移动的位置增加1
else L.data[i-num] = L.data[i];//不相等则将该元素向前移动num个位置
}
for(int i = num; i < L.length; i++){
L.data[i] = NULL;//移动后的位置置为空
}
}
通常将顺序表理解为数组,算法是针对顺序表做的,数组同理,较为简单。算法的空间复杂度为O(1),时间复杂度为O(n)。
顺序表结构体:
#define MAX 20
typedef struct{
ElemType data[MAX];
int length;
}SqList;