目录
题目
思路
代码
题目
题目描述
建立顺序表L,将指定区间的数据从顺序表中删除。假设指定区间是合法数据,无序做合法性判断。测试数据为整型。
输入
第一行是表长n;第二行是表中数据元素;第三行是闭区间。
输出
删除以后的顺序表中的数据元素。
样例输入
10
22 32 11 23 43 59 17 65 45 57
10 20
样例输出
22 32 23 43 59 65 45 57
思路
思路一:每删除一个在区间的值,然后整体向前移动一位,这是一个时间复杂度为O(n^2),空间复杂度为O(1)的算法。
主要代码演示:
void SeqlistEarse(Seqlist* &L)
{
int max, min, i;
cin >> min >> max;
for (i = 0; i < L->len; i++)
{
if (L->data[i] >= min && L->data[i] <= max)
{
for (int j = i; j < L->len - 1; j++) L->data[j] = L->data[j + 1];
L->len--;
}
}
}
思路二:借助一个新的顺序表,存放不在区间[min,max]的值,最后再把新的顺序表输出,这是一个这是一个时间复杂度为O(n),空间复杂度为O(n)的算法。
主要代码演示:
void SeqlistEarse(Seqlist* &L, Seqlist* &L1)
{
int max, min, i;
cin >> min >> max;
for (i = 0; i < L->len; i++)
{
if (L->data[i] < min || L->data[i] > max)
{
L1->data[L1->len++] = L->data[i];
}
}
}
思路三:重新利用原来的空间完成任务,具体请看代码演示,这是一个时间复杂度为O(n),空间复杂度为O(1)的算法。
主要代码演示:
void SeqlistEarse(Seqlist *&L)
{
int max, min, i, k = 0;
cin >> min >> max;
for (i = 0; i < L->len; i++)
{
if (L->data[i] < min || L->data[i] > max)
{
L->data[k++] = L->data[i];
}
}
L->len = k;
}
注:这三种算法按理来说都是可行的,但是博主亲测了一下只有后两种算法才能通过,SWUST OJ的后台测试,不难看出最后一种算法才是最优的,因此博主展示最后一种算法的数据结构代码和C++中STL的代码。
亲测:
代码
数据结构
#include#include using namespace std; //定义顺序表 typedef struct { int data[10005], len; } Seqlist; //初始化顺序表 void SeqlistInit(Seqlist* &L) { L = (Seqlist *)malloc(sizeof(Seqlist)); L->len = 0; } //创建顺序表 void SeqlistCreate(Seqlist* &L) { int n, x; cin >> n; while (cin >> x, L->data[L->len++] = x, --n); } //删除数据 void SeqlistEarse(Seqlist* &L) { int max, min, i, k = 0; cin >> min >> max; for (i = 0; i < L->len; i++) { if (L->data[i] < min || L->data[i] > max) { L->data[k++] = L->data[i]; } } L->len = k; } //打印顺序表 void SeqlistPrint(Seqlist* &L) { for (int i = 0; i < L->len - 1; i++) cout << L->data[i] << ' '; cout << L->data[L->len - 1] << endl; } int main() { Seqlist *L; SeqlistInit(L); SeqlistCreate(L); SeqlistEarse(L); SeqlistPrint(L); return 0; }
STL
#include #include#include using namespace std; int main() { vector vec; int n, x, max, min, k = 0; cin >> n; while (cin >> x, vec.push_back(x), --n); cin >> min >> max; for (int i = 0; i < vec.size(); i++) { if (vec[i] < min || vec[i] > max) vec[k++] = vec[i]; } for (int i = 0; i < k; i++) cout << vec[i] << ' '; return 0; }



