1. 程式人生 > >編寫程式,在一非遞減的順序表L中,刪除所有值相等的多餘元素。要求時間複雜度O(n),空間複雜度為O(1)

編寫程式,在一非遞減的順序表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 就是順序表的長度