【数据结构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

相关文章
☀☀☀☀☀☀☀有关栈和队列应用的oj题讲解☼☼☼☼☼☼☼
### 简介 本文介绍了三种数据结构的实现方法:用两个队列实现栈、用两个栈实现队列以及设计循环队列。具体思路如下: 1. **用两个队列实现栈**: - 插入元素时,选择非空队列进行插入。 - 移除栈顶元素时,将非空队列中的元素依次转移到另一个队列,直到只剩下一个元素,然后弹出该元素。 - 判空条件为两个队列均为空。 2. **用两个栈实现队列**: - 插入元素时,选择非空栈进行插入。 - 移除队首元素时,将非空栈中的元素依次转移到另一个栈,再将这些元素重新放回原栈以保持顺序。 - 判空条件为两个栈均为空。
|
存储 算法 Java
Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性
Java Set因其“无重复”特性在集合框架中独树一帜。本文解析了Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性,并提供了最佳实践建议,包括选择合适的Set实现类和正确实现自定义对象的hashCode()与equals()方法。
366 4
|
存储 Java
数据结构第三篇【链表的相关知识点一及在线OJ习题】
数据结构第三篇【链表的相关知识点一及在线OJ习题】
181 7
|
存储 索引
【数据结构OJ题】设计循环队列
力扣题目——设计循环队列
187 1
【数据结构OJ题】设计循环队列
【数据结构OJ题】复制带随机指针的链表
力扣题目——复制带随机指针的链表
185 1
【数据结构OJ题】复制带随机指针的链表
|
存储 C语言
【数据结构】c语言链表的创建插入、删除、查询、元素翻倍
【数据结构】c语言链表的创建插入、删除、查询、元素翻倍
275 0
【数据结构】c语言链表的创建插入、删除、查询、元素翻倍
【数据结构OJ题】用栈实现队列
力扣题目——用栈实现队列
162 0
【数据结构OJ题】用栈实现队列

热门文章

最新文章