编写程序,在一非递减的顺序表L中,删除所有值相等的多余元素。要求时间复杂度O(n),空间复杂度为O(1)

翠花上代码:

Status delExcrescentValue(SeqList &S){
    int flag = 0,val = S.elem[0];//记录值不等的下标
    //printf("%d\n",S.elem[0]);
    for(int i = 1;i<=S.last;i++){
        if(val != S.elem[i]){
            val = S.elem[i];
            flag+=1;
            S.elem[flag] = val;
            printSeqList(S);
        }
    }
    S.last = flag;
    return OK;
}

算法分析:要求时间复杂度O(n),空间复杂度为O(1),所以只能出现一个 for 循环,而且只能在原表的内存空间操作;

定义变量 flag 始终为遍历顺序表的过程中不等元素里的最新元素的下标,(同时它也是最大元素由于是非递减顺序表);

定义变量 val 存储的是遍历顺序表的过程中不等元素里的最新元素的,用 val 和遍历顺序表过程中的其他元素 S.elem[i] 比较,如果不等,就把这个元素 S.elem[i] 放到  S.elem[flag] 元素的下一个位置 ,所以要把 flag 加1,最后把顺序表长度减短就行了,也就是把 flag 赋值给 S.last ;

ps:S.last 存储的是顺序表最后一个元素的下标,S.last+1 就是顺序表的长度

你可能感兴趣的:(数据结构)