27.移除元素(LeetCode)

简介: 27.移除元素(LeetCode)

想法一

循环遍历整个数组,碰到数值等于val的元素,后续元素向前挪动一格,将其覆盖


时间复杂度:O(N^2)   空间复杂度:O(1)


想法二

想法一思考起来比较简单,容易想到,但是时间复杂度太高,有没有什么方法可以降低空间复杂度呢?


 以空间换时间:创建一个临时数组,src和dst两个指针。如果src指向的元素不是val,则把src指向的元素拷贝到tmp数组里,src++,dst++;如果是val,则src++,跳过该元素


时间复杂度:O(N)  空间复杂度:O(N)


想法三

想法二的空间复杂度虽然不符合要求,但是给了我们一种新的思路


其实,我们发现不用创建临时数组,直接在原数组进行操作也是可以的 。还是创建src和dst两个指针,当元素为val时,src++,跳过该元素;当src指向的元素不等于val时,将其拷贝到dst指向的空间,src++,dst++,这样就可以覆盖前面为val的元素

上图分析:0和1都不为val,所以src和dst一起到2,而2为val,则dst留在2,src++,直到3,此时3不为val,则把3拷贝到dst的位置,覆盖之前的2,然后src++,dst++,依此类推


时间复杂度:O(N)   空间复杂度:O(1)


这样,我们就得到了时间与空间共同的较优解


代码如下:

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


这里src和dest是整型变量,代表数组下标,实际上作用也是指针 ,而且返回长度更加方便

相关文章
|
6天前
题目----力扣--移除链表元素
题目----力扣--移除链表元素
12 1
|
7天前
|
存储 算法 索引
【力扣刷题】只出现一次的数字、多数元素、环形链表 II、两数相加
【力扣刷题】只出现一次的数字、多数元素、环形链表 II、两数相加
18 1
|
12天前
|
算法 C语言
Leetcode_203.移除链表元素—C语言
Leetcode_203.移除链表元素—C语言
|
13天前
|
人工智能
力扣100114. 元素和最小的山形三元组 II(中等)
力扣100114. 元素和最小的山形三元组 II(中等)
|
18天前
|
存储
力扣 合并两个有序数列||移除元素
力扣 合并两个有序数列||移除元素
18 0
|
19天前
leetcode代码记录(下一个更大元素 II
leetcode代码记录(下一个更大元素 II
11 0
|
19天前
|
索引
leetcode代码记录(下一个更大元素 I
leetcode代码记录(下一个更大元素 I
9 0
|
7天前
|
索引
【力扣刷题】两数求和、移动零、相交链表、反转链表
【力扣刷题】两数求和、移动零、相交链表、反转链表
15 2
【力扣刷题】两数求和、移动零、相交链表、反转链表
|
7天前
|
算法
"刷题记录:哈希表+双指针 | leetcode-2465. 不同的平均值数目 "
该文段是一篇关于编程题目的解答,主要讨论如何找到数组中所有不同平均值的个数。作者首先使用排序和哈希集来解决,将数组转为列表排序后,通过双指针计算平均值并存入哈希集以去重。然后,作者发现可以优化方案,通过双指针在排序后的数组中直接计算两数之和,用哈希集记录不重复的和,从而避免实际计算平均值,提高了算法效率。最终代码展示了这两种方法。
15 0
|
7天前
|
索引
【力扣刷题】删除链表的倒数第 N 个结点、两两交换链表中的节点、随机链表的复制
【力扣刷题】删除链表的倒数第 N 个结点、两两交换链表中的节点、随机链表的复制
13 0