设计一个高效的算法,从顺序表L中删除所有值介于x和y之间(包括x和y)的所有元素(假设y>=x),要求时间复杂度为O(n),空间复杂度为O(1)。
函数原型如下:
void?del_x2y(SeqList?*L,?ElemType x,?ElemType y);
相关定义如下:
struct _seqlist{
ElemType elem[MAXSIZE];
int last;
};
typedef struct _seqlist SeqList;
代码:
#include <stdio.h>
#include <stdlib.h>
#include "list.h" // 请不要删除,否则检查不通过
void del_x2y(SeqList *L, ElemType x, ElemType y) {
int pre,res;
for(pre = 0, res = 1; res <= L->last;){
if((L->elem[pre] >= x && L->elem[pre] <= y) && (L->elem[res] < x || L->elem[res] > y)) {
L->elem[pre] = L->elem[res];
L->elem[res] = x;
pre++;
res++;
} else if((L->elem[pre] < x || L->elem[pre] > y) && (L->elem[res] < x || L->elem[res] > y)){
pre++;
if(pre == res){
res++;
}
} else if((L->elem[pre] >= x && L->elem[pre] <= y) && (L->elem[res] >= x && L->elem[res] <= y)) {
res++;
} else if((L->elem[pre] < x || L->elem[pre] > y) && (L->elem[res] >= x && L->elem[res] <= y)) {
pre++;
res++;
}
}
if(L->elem[pre] >= x && L->elem[pre] <= y){
L->last = pre - 1;
} else {
L->last = pre;
}
}
|