LC 26.删除有序数组的重复项

60 阅读1分钟

题目描述:

给定非严格递增的数组numsnums

原地删除重复出现的元素,最终每个元素只出现一次,保持元素一致的相对顺序,

返回删除后数组的长度。

LCLCCC 语言中* nums表示数组,nums[i]表示数组的第(i+1)(i+1)个元素

一开始的思路:

numsnums当成链表,nums->value==nums->next->value判断是否保留nums->next

报错:request for member 'next' in something not a structure or union

错误地使用了结构体指针

意识到numsnums是数组,定义了三个辅助变量i,j,ki,j,k

ii标识新数组中元素的位置,接收旧数组中不重复的元素

jj遍历旧数组的标识,每次加一,遇到与后一个位置不同值的元素时,传给新数组

kk新数组元素个数,因为LCLC中无法直接得出数组长度,得自行计算

优化:kkii有着线性关系即k=i+1k=i+1,可去掉一个辅助变量

代码:

int removeDuplicates(int* nums, int numsSize) {
    int k = 0;
    for (int j = 1; j < numsSize; j++) {
        if (nums[j]!=nums[j-1]) {
            nums[++k] = nums[j]
        }
    }
    return ++k;
}

时间复杂度:O(n)O(n),因为只需遍历数组一次,击败100.00%100.00\%
空间复杂度:O(1)O(1),因为只涉及到两个辅助变量,击败20.97%20.97\%