从有序顺序表中删除所有其值重复的元素,使表中所有元素的值均不同。要求:
(1)给出算法的设计思想。
(2)用C语言或C++语言描述算法,关键之处给出注释。
(3)说明算法的时间复杂度。
一、算法设计思想
1.使用两个指针i和j,初始时都指向顺序表的第一个元素。
2.指针j向后移动,当遇到与i所指元素不同的元素时,将j所指元素赋值给i + 1所指位置,然后i指针向后移动一位。
3.重复步骤 2,直到j到达顺序表的末尾。
二、代码实现
#include <stdio.h>
// 从有序顺序表中删除重复元素
void removeDuplicates(int arr[], int *n) {
if (*n == 0) return;
int i = 0;
for (int j = 1; j < *n; j++) {
// 如果 j 指向的元素与 i 指向的元素不同
if (arr[j]!= arr[i]) {
i++;
arr[i] = arr[j];
}
}
*n = i + 1;
}
int main() {
int arr[] = {1, 2, 2, 3, 3, 4, 5, 5};
int n = sizeof(arr) / sizeof(arr[0]);
removeDuplicates(arr, &n);
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
return 0;
}
三、时间复杂度
由于只需要遍历一次顺序表,所以时间复杂度为O(n),其中n是顺序表的长度。