要求:删除一个顺序表中值为x的元素,时间复杂度为O(n),空间复杂度为O(1)
本体来自王道2023数据结构中顺序表解答题中的第3题,需要在空间复杂度和时间复杂度上符合要求,因此很难使用常规的删除操作,顺序表的删除一般时间复杂度为O(n),最坏的情况下遍历一次加删除n个元素,时间复杂度为O(n^2),显然是不合适的,而且要存储多个数组下标也不符合空间复杂度O(1)的要求,因此我们只有采用别的办法。
bool del_all_x(sqList &L, int x) {
if (L.length == 0)
return false;
int count = 0;
//记录不等于x的元素的个数,然后将不等于该元素的值放到数组下标为count处
for (int i = 0; i < L.length; ++i) {
if (L.elem[i] != x) {
L.elem[count++] = L.elem[i];
}
}
//处理完后,需要修改数组长度,显然长度=不等于x的所有值
L.length = count;
return true;
}