目录
题目
思路
代码
题目描述
建立顺序表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;
}