面试经典150题-3- 删除有序数组中的重复项-力扣26

91 阅读1分钟

删除有序数组中的重复项-力扣26

难度:easy

题目描述

image.png

示例

image.png

解法1:时间换空间

从下标位置为1的开始,从后往前看,当当前元素和前一个元素相同时,说明存在重复元素,删除掉重复元素即可

删除元素后,后面的部分从i~k-2均前移1个 image.png

c代码

int removeDuplicates(int* nums, int numsSize) {
    // 边界相关
    if(numsSize == 0 || numsSize == 1) return numsSize;  //给的数据nums是>=1的,这里面对0的判断可以省略

    int i = 1, j, k = numsSize; // k用来存储删除后的数组长度
    while(1){
        if(i == k) break;

        if(nums[i] == nums[i-1]){
          // 出现重复元素,删除重复元素,把后面的集体前移
          for(j = i; j < k - 1; j ++)
            nums[j] = nums[j+1];

          k --;
          // 删除了元素后i指针就不用再前进了
        } else {
            i ++;
        }
        
    }

    return k;
}

时间复杂度:O(n2)O(n^2)

时间换空间的结果 image.png

go代码

func removeDuplicates(nums []int) int {
    left := 0

    for right, v := range nums {
        if right == 0{
            continue
        }

        // 如果出现重复元素 v == nums[left], 让left不动, right++即可
        // 如果元素不重复,则left++即可
        if v != nums[left] {
            left ++
            nums[left] = v   
        }

    }

    return left+1
}

java代码