【数据结构OJ题】移除元素

简介: 力扣题目——移除元素

1. 题目描述

17ff5d06c1729de48a30fe856011fe2b.png

2. 思路分析

方法一:暴力删除,挪动数据覆盖。即遍历整个nums[ ]数组,遇到值等于val的元素,就将整个元素后面的所有元素都向左挪动一位。

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

空间复杂度:O(1)

方法二:时间换空间。额外开辟一个tmp[ ]数组。定义两个变量src和dst,src遍历nums[]数组,dst最开始指向tmp[ ]的最开始位置。将src位置不等于val的值插入到dst位置,然后再把tmp[ ]数组拷贝回去。

流程演示:
0a0e22db417bbf76e92f226fc1d7ef1e.png
2eba56295e2b9dc1a4e5a8f6683d82f4.png
48d73840ba04ffd3978ade167f6ce3a0.png
60a6e5c42fbc4f0e0e08e32100b82e6b.png

时间复杂度:O(N)

空间复杂度:O(N)

方法三:和方法二类似,但是直接在原数组操作。定义两个变量src和dst,src遍历nums[]数组,dst最开始指向nums[ ]的最开始位置。将src位置不等于val的值插入到dst位置。(也就是src在nums[ ]数组找不是val的值依次尾插

我们也把这种算法叫双指针算法

流程演示:
e524396249fc845a72d722dfc1afc111.png
069fdcc56509c663ef04fd4d2f76545d.png
3cbaedffaea6ce0173048aadcca724aa.png

时间复杂度:O(N)

空间复杂度:O(1)

我们发现通过双指针算法大大优化了时间复杂度和空间复杂度!

3. 代码实现

我们这里进行时间复杂度和空间复杂度最优的方法三的代码实现:

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

3a40a56045a0eabf947d635a1b2832a6.png

相关文章
|
2月前
|
存储 算法 Java
Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性
Java Set因其“无重复”特性在集合框架中独树一帜。本文解析了Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性,并提供了最佳实践建议,包括选择合适的Set实现类和正确实现自定义对象的hashCode()与equals()方法。
45 4
|
2月前
|
存储 Java
数据结构第三篇【链表的相关知识点一及在线OJ习题】
数据结构第三篇【链表的相关知识点一及在线OJ习题】
29 7
|
5月前
【数据结构OJ题】环形链表
力扣题目——环形链表
41 3
【数据结构OJ题】环形链表
|
5月前
|
存储 索引
【数据结构OJ题】设计循环队列
力扣题目——设计循环队列
38 1
【数据结构OJ题】设计循环队列
|
5月前
【数据结构OJ题】有效的括号
力扣题目——有效的括号
39 1
【数据结构OJ题】有效的括号
|
5月前
【数据结构OJ题】复制带随机指针的链表
力扣题目——复制带随机指针的链表
55 1
【数据结构OJ题】复制带随机指针的链表
|
5月前
【数据结构OJ题】环形链表II
力扣题目——环形链表II
35 1
【数据结构OJ题】环形链表II
|
5月前
【数据结构OJ题】相交链表
力扣题目——相交链表
37 1
【数据结构OJ题】相交链表
|
4月前
|
存储 C语言
【数据结构】c语言链表的创建插入、删除、查询、元素翻倍
【数据结构】c语言链表的创建插入、删除、查询、元素翻倍
【数据结构】c语言链表的创建插入、删除、查询、元素翻倍
|
5月前
【数据结构OJ题】用栈实现队列
力扣题目——用栈实现队列
41 0
【数据结构OJ题】用栈实现队列