編寫程式,在一非遞減的順序表L中,刪除所有值相等的多餘元素。要求時間複雜度O(n),空間複雜度為O(1)
阿新 • • 發佈:2018-11-04
翠花上程式碼:
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 就是順序表的長度