LeetCode 27.移除元素

简介: LeetCode 27.移除元素

💡题目分析

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

035be2cd0ce94dbd8c53b6dd76f2edb7.pnge72cc7da22994b62912b68f94c299bfa.png

ca2a01e0acc44fa093567932653d72d8.png

0fd29dff2ce744e592a6d4b7fffd8f05.png


💡解题思路

🚩思路1:暴力求解 — 遍历

直接一个循环遍历nums数组每个元素;

再对每个元素判断是否和val相等;

相等就把后面的元素往前挪动覆盖它,已达到删除val的目的;

🚨注意:移除元素后,要对数组元素个数 -1numsSize-1的同时,还要对第一层的for循环遍历的 ii- -,因为元素移动覆盖时候位置发生变化

👇图解👇

8934067a6920457982801e2d6654965a.png

🔔接口源码:

int removeElement(int* nums, int numsSize, int val)
{
    int tmp = numsSize ; //创建临时变量,返回时候要用
  int count = 0; //统计移除元素的个数
  for(int i = 0; i<numsSize; i++)
  {   
    if(val == nums[i])
    {
      count++;
      for(int j = i; j<numsSize -1; j++)
      {
        nums[j] = nums[j+1];        
      }
            numsSize--;
            i--; //由于元素都是往前挪动了,所以i也要--
    }
  }
  return tmp - count;
}

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


🚩思路2:空间换时间

创建一个新数组 tmp,大小为 numsSize;

同时把原数组 nums中,不等于 val的数据,放到新数组 tmp中;

然后再把 tmp中的数据拷贝回到原数组 nums中;

👇图解👇

40fb47cbe2ac4f88ae8cbbdbd12c496b.png

🔔接口源码:

int removeElement(int* nums, int numsSize, int val)
{
    int *tmp = (int*)malloc(sizeof(int) * numsSize);
    int j = 0;//执行临时数组的下标
    //找不等于val的值放到临时数组
    for(int i = 0; i<numsSize; i++){
        if(val != nums[i]){
            tmp[j++] = nums[i];
        }
    }
    //把临时数组的值,覆盖回去
    //上面的循环结束后,j  = 不是val元素的个数
    for(int i = 0; i<j; i++){
        nums[i] = tmp[i];
    }
    return j;
}

此方法:
时间复杂度:O(N)
空间复杂度:O(N)


🚩思路3:双指针(快慢指针)

定义两个指针:一个dst,一个src;

dst表示目的地指针,src是原指针,src用来移动寻找不等于val的值;

src找到不等于val的值那么就把它赋值给dst对应的值,即 nums[dst] = nums[src],同时dst++; src++

src碰到与val相等的值,那么src++,其他不变

👇图解👇

50355644dc5f4c41bb10c3cf4e71a8ce.png

b460ab635702447e8d4e98a30714f659.png

🔔接口源码:

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++];
        }
        else
        {
            src++;
        }
    }
    return dst;
}

同理的 ,也可以这样写👇

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


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

f5cb60839b274ceeaf55747ce7842a9c.png

目录
相关文章
|
4天前
|
存储 算法
LeetCode第83题删除排序链表中的重复元素
文章介绍了LeetCode第83题"删除排序链表中的重复元素"的解法,使用双指针技术在原链表上原地删除重复元素,提供了一种时间和空间效率都较高的解决方案。
LeetCode第83题删除排序链表中的重复元素
|
4天前
|
算法 索引
LeetCode第34题在排序数组中查找元素的第一个和最后一个位置
这篇文章介绍了LeetCode第34题"在排序数组中查找元素的第一个和最后一个位置"的解题方法,通过使用双指针法从数组两端向中间同时查找目标值,有效地找到了目标值的首次和最后一次出现的索引位置。
LeetCode第34题在排序数组中查找元素的第一个和最后一个位置
|
14天前
|
Python
【Leetcode刷题Python】剑指 Offer II 082. 含有重复元素集合的组合
解决LeetCode平台《剑指 Offer II 082. 含有重复元素集合的组合》题目的Python代码实现,通过深度优先搜索算法找出所有和为特定目标值的数字组合,并在搜索过程中通过排序和跳过重复元素来避免解集中出现重复组合。
23 2
|
4天前
|
算法
LeetCode第27题移除元素
这篇文章介绍了LeetCode第27题"移除元素"的解题方法,通过使用双指针技巧,有效移除数组中特定值的元素并返回新数组的长度。
|
15天前
|
算法 索引 Python
【Leetcode刷题Python】34. 在排序数组中查找元素的第一个和最后一个位置(二分查找)
解决LeetCode "在排序数组中查找元素的第一个和最后一个位置" 问题的方法。第一种方法是使用两次二分查找,首先找到目标值的最左边界,然后找到最右边界。第二种方法是利用Python的list.index()方法,先正序找到起始位置,再逆序找到结束位置,并给出了两种方法的Python实现代码。
30 0
|
15天前
|
Python
【Leetcode刷题Python】203.移除链表元素
文章提供了三种删除链表中特定值节点的方法:迭代法、虚拟节点迭代删除法和递归法,并给出了相应的Python实现代码。
8 0
|
2月前
|
算法
【经典LeetCode算法题目专栏分类】【第10期】排序问题、股票问题与TOP K问题:翻转对、买卖股票最佳时机、数组中第K个最大/最小元素
【经典LeetCode算法题目专栏分类】【第10期】排序问题、股票问题与TOP K问题:翻转对、买卖股票最佳时机、数组中第K个最大/最小元素
|
1月前
2670.找出不同元素数目差数组-力扣(LeetCode)
2670.找出不同元素数目差数组-力扣(LeetCode)
15 0
|
2月前
|
存储 算法 Java
力扣经典150题第四十五题:存在重复元素 II
力扣经典150题第四十五题:存在重复元素 II
17 0
|
2月前
|
索引
leetcode题解:27.移除元素
leetcode题解:27.移除元素
25 0