目录
题目内容:
编写程序实现顺序表的各种基本运算。对给定字符数组a[]={'1','2','3','1','1','0','4','2','3','1','0','4','2'},创建顺序表L,删除从'2'到'3'的元素。要求时间复杂度为O(n),空间复杂度为O(1)。
问题分析:
-
使用顺序表:
结构体定义:
typedef int ElemType;
typedef struct {
ElemType data[MaxSize];
int listsize;
}SqList;
-
时间复杂度O(n),空间复杂度O(1)
关键部分代码(删除顺序表2-3的数据):
传递参数为Sqlist(顺序表)指针的引用SqList*& L以及顺序表内数组长度int n
解法一:
void DeleteItemsFrom2To3(SqList*& L, int n) {
int j = 0, len = 0;
for (int i = 0; i < n; i++) {
if (L->data[i]>3||L->data[i]<2) {
L->data[j] = L->data[i];
j++;
len++;
}
}
L->listsize = len;
}
时间复杂度:O(n)
空间复杂度:O(1)
-
思路分析:
思路比较常见,两个指针,一个指针一直向前,一个指针遇到非2-3之间的数据才会前进,所以遇到了要求删除数据会停下来,等待下一个非被删数据,并被覆盖
解法二:
void DeleteItemsFrom2To3(SqList*& L, int n) {
int j = 0;
for (int i = 0; i < n; i++) {
if (L->data[i] > 3 || L->data[i] < 2) {
int temp = L->data[i];
L->data[i] = L->data[j];
L->data[j] = temp;
j++;
}
}
L->listsize = j;
}
时间复杂度:O(n)
空间复杂度:O(1)
-
思路分析:
类似快速排序思想,两个指针,当前元素是非删除元素,把其交换到左边,是该被删除元素,把其交换到右边
总结:
两种思路其实差不多,只不过对于该删除元素的处理解法一是直接覆盖元素,解法二是把被删除数交换到右边,核心点在于双指针操作,一个指针一个个遍历,一个指针遇到该删除数据停下来记录。