C语言数据结构-在数组中原地删除指定数据

1.题目

       给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/remove-element


2.编程思路

        (1)遍历数组中所有元素,用待删除数据val后面的数据覆盖待删除数据,需要后面的数据整体前挪。如图1所示,假如需要删除的数据val=0,遍历到第一个要删除的数据0,就把后面的2、3都往前移动,然后再遍历,重复上面的遍历和前移操作,直到遍历完整个数组。

C语言数据结构-在数组中原地删除指定数据_第1张图片

 图1

        时间复杂度:O(n^2),因为最坏的情况就是数组中每个数据都是需要被删除的,每次需要前挪n-1、n-2、n-3、...、2、1次,利用等差数列求和得到最高次幂为n^2。

        空间复杂度:O(1)

        (2)重新申请一个新的数组空间,将不需要删除的数据插入到新的数组中,跳过需要删除的数据,最后将新的数组内容拷贝给旧的数组。如图2所示,需要删除的数据为0,拷贝数据进新数组饿时候就忽略0。

C语言数据结构-在数组中原地删除指定数据_第2张图片

图2 

        时间复杂度:O(n),最多执行n次赋值和n次拷贝共2*n。

        空间复杂度:O(n),开辟了元素个数为n的新数组。

        (3)使用双指针(其实也不是指针,就是序号而已),假如要删除的数据是0,如图3所示,定义两个序号:src、dst且赋初值0,当src所指向的数据不是待删除的对象时,把该数据赋值给dst,然后两个序号都+1;如果src所指向的数据是待删除的数据时,src+1,dst不变。

C语言数据结构-在数组中原地删除指定数据_第3张图片

 图3

        时间复杂度:O(n),相当于执行了n次条件赋值操作

        空间复杂度:O(1)

3.代码

int removeElement(int* nums, int numsSize, int val){
    int src = 0;
    int dst = 0;
    while(src < numsSize)
    {
        if(nums[src] != val)
        {
            nums[dst] = nums[src];
            src++;
            dst++;
        }
        else
        {
            src++;
        }
    }
    return dst;
}

你可能感兴趣的:(leetcode,算法,职场和发展,数据结构)