用C语言实现:遍历数组删除其中的重复元素,要求时间复杂度为O(n),空间复杂度为O(1)
时间: 2024-10-19 09:14:16 浏览: 23
在C语言中,可以使用一个辅助变量和一个临时存储位置来遍历数组并删除重复元素,同时保持时间复杂度为O(n)和空间复杂度为O(1)。这里我们假设输入数组`arr[]`已排序,因为我们可以在遍历时利用这一点。
```c
#include <stdio.h>
// 删除数组 arr 中的重复元素
void removeDuplicates(int arr[], int n) {
if (n == 0 || n == 1) return; // 如果数组为空或只有一个元素,直接返回
int i = 0; // 主索引
for (int j = 1; j < n; j++) { // 遍历从第二个元素开始
if (arr[j] != arr[i]) { // 当前元素不等于已处理的元素
i++; // 将主索引向后移动,将当前元素放入有效位置
arr[i] = arr[j]; // 保存当前元素
}
}
// 最终数组大小减1,因为最后的那个非重复元素会被保留
arr[i+1] = '\0'; // 添加空字符作为结束标记
}
int main() {
int arr[] = {1, 2, 2, 3, 4, 4, 5};
int n = sizeof(arr) / sizeof(arr[0]);
printf("Original array: ");
for (int i = 0; i < n; i++)
printf("%d ", arr[i]);
printf("\n");
removeDuplicates(arr, n);
printf("Array after removing duplicates: ");
for (int i = 0; i <= n - 1; i++)
printf("%d ", arr[i]); // 注意最后一个元素不是'\0'
printf("\n");
return 0;
}
```
这个程序会删除数组中的重复元素,使得原数组的前i个元素是唯一的。注意,这种方法只适用于已经排序过的数组,如果数组无序,你需要先排序,这会使时间复杂度变高。此外,这里的"\0"是一个占位符,表示数组结束,实际数组不会包含这样的元素。
阅读全文