用c语言编写,在一非递减的顺序表L中,删除所有值相等的多余元素。要求时间复杂度为O(n),空间复杂度为O(1);
时间: 2023-05-19 22:06:23 浏览: 98
可以使用双指针法来实现这个算法。定义两个指针i和j,初始时i=0,j=1。从第二个元素开始,如果L[j]与L[i]相等,则j++;否则,将L[j]赋值给L[i+1],i++,j++。最后,将L的长度设置为i+1即可。这个算法的时间复杂度为O(n),空间复杂度为O(1)。
以下是代码实现:
void removeDuplicates(int *L, int n) {
int i = 0, j = 1;
while (j < n) {
if (L[j] == L[i]) {
j++;
} else {
L[++i] = L[j++];
}
}
n = i + 1;
}
相关问题
用c语言在一个非递减的顺序表中删除所有值相等的多余数。要求时间复杂度O(n).空间复杂度O(1)
可以使用双指针法来解决这个问题。定义两个指针i和j,初始值都为0。从第二个元素开始遍历顺序表,如果当前元素与前一个元素相等,则j指针向后移动一位;如果当前元素与前一个元素不相等,则将i指针指向的位置更新为当前元素,同时将j指针指向的位置的值复制到i指针指向的位置,然后i指针向后移动一位。最后,将i指针指向的位置之后的元素全部删除即可。
以下是代码实现:
void removeDuplicates(int* nums, int numsSize){
if (numsSize == 0) return;
int i = 0, j = 1;
while (j < numsSize) {
if (nums[j] == nums[i]) {
j++;
} else {
nums[++i] = nums[j++];
}
}
while (i < numsSize - 1) {
nums[++i] = 0;
}
}
编写算法,在一非递减的顺序表L中,删除所有值相等的多余元素。要求时间复杂度为O(n),空间复杂度为O(1)。 非递减顺序表举例:{2 2 2 3 4 4 5 5 6 6} 用c语言写
void removeDuplicates(int* L, int len) {
int i, j;
for (i = 0, j = 1; j < len; j++) {
if (L[i] != L[j]) {
L[++i] = L[j];
}
}
// 将末尾多余的元素删除
len = i + 1;
}
// 示例
int main() {
int L[] = {2, 2, 2, 3, 4, 4, 5, 5, 6, 6};
int len = sizeof(L) / sizeof(int);
removeDuplicates(L, len);
for (int i = 0; i < len; i++) {
printf("%d ", L[i]);
}
return 0;
}
// 输出:2 3 4 5 6
阅读全文