题目
有一个整数顺序表L,设计一个尽可能高效的算法删除其中所有值为负整数的元素(假设L中值为负整数的元素可能有多个),删除后元素的相对次序不改变,并给出算法的时间复杂度和空间复杂度。
实现
算法描述
- 初始化:创建两个索引,
i
和j
。i
用于遍历数组,j
用于记录下一个非负整数应存放的位置。 - 遍历数组:从头到尾遍历数组,检查每个元素。
- 如果当前元素非负,将其复制到
arr[j]
,并递增j
。
- 如果当前元素非负,将其复制到
- 调整数组大小:根据
j
的值调整数组大小,因为j
代表了非负整数的数量。
代码
#include <iostream>
using namespace std;
void removeNegatives(int arr[], int& n) {
int j = 0;
for (int i = 0; i < n; ++i) {
if (arr[i] >= 0) {
arr[j++] = arr[i];
}
}
n = j; // 更新数组大小
}
int main() {
int n;
cin >> n;
int* arr = new int[n];
for (int i = 0; i < n; i++)
cin >> arr[i];
removeNegatives(arr, n);
for (int i = 0; i < n; ++i) {
cout << arr[i] << " ";
}
cout << endl;
delete[] arr;
return 0;
}
时间复杂度:
- 𝑂(𝑛),因为我们只需要遍历数组一次,其中
n
是数组的初始长度。
空间复杂度:
- 𝑂(1),我们没有使用额外的数据结构,仅在原数组上进行操作,除了用于索引的几个变量外没有额外的空间开销。